PDA

Просмотр полной версии : Программисты DELPHI хелп!!!!!


Тарифы: МТС, Билайн, МегаФон
Выгодные непубличные тарифы МТС, Билайн, МегаФон, Безлимитный интернет ✅
Factor X
04-07-2006, 16:33
Такой вопрос:
Есть компонент Memo1 в котором вписаны в столбец различные цифры (около 100 Strings)
Необходимо программно сделать циклом так чтобы после каждой строчки с цифрой следовала бы пустая строчка (string)

строка с первой цифрой
"пустая строчка"
строка со второй цифрой
"пустая строчка"
.......и т .д последней строчки с цифрой в Memo1

Буду он очень благодарен если кто то выложит код или даст ссылку?:)

Neyron
04-07-2006, 16:40
создаешь массив строковый.M[i]
затем загоняешь в него эти 100 строк(через цикл)
очищаешь столбец
затем также через цикл начинаешь заполнять
цикл начало
бла бла.add(m[i]);
бла бла. add("");
конец цикла
))

Matr!x
04-07-2006, 17:23
procedure MakeEnters(Memo : TMemo);
var
i:integer;
st:TStringList;
begin
st:=TStringList.Create;
for i:=0 to memo1.Lines.Count - 1 do
begin
st.Add(memo.Lines[i]);
st.Add('');
end;
memo.Lines.Assign(st);
st.Free;
end;

Matr!x
04-07-2006, 17:27
или так:

var
i:integer;
begin
for i:=0 to memo1.Lines.Count - 1 do
memo1.Lines.Insert((i*2)+1,'');
end;

ManInXRay
04-07-2006, 18:18
Т.к. TMemo является "оберткой" для Windows'кого Std Control'а, работа с его содержимым (Lines, Text и т.п.) реализована через WinAPI ...
Предположу, что указанный ниже вариант "удвоения количества строк" будет работать в разы быстрее (если это ваще критично :) ), чем изменение непосредственно через Lines.

var
Src,Dst:String;
i:Integer;
begin
Src:=Memo1.Text;
Dst:='';
for i:=1 to Length(Src) do begin
Dst:=Dst+Src[i];
if Src[i]=#10 then Dst:=Dst+#13#10;
end;
Memo1.Text:=Dst;
end;

Семь Сорок
04-07-2006, 18:47
угу, ща все плавно перейдем на ассемблер :D

ManInXRay
04-07-2006, 19:19
Точно)) И будем юзать MXX... Нет! Лучше SSE-инструкции и представление символов числом с плавающей точкой))

Factor X
05-07-2006, 13:47
Спасибо большое всем парни..
Внезапно отпала необходимость добавлять пробелы в Memo
Немного прикинув все решил проше на стадии загрузки в это самое Меmо там и отсортировал в пробелы.

Но появилась другая проблема что то не получаеться осуществить цикл в цикле
Скажем есть Memo1 в нем много строк (String) они не отсортированы а разбросаны по разному и нужно скажем взять первю строчку проверить по всем есть ли еще такая копия строчки где либо ниже потом взять вторую строчку и т д до последней строчки и добавить все во второе Memo без копий..
Я конешно понимаю можно сначала отсортировать Мемо а потом пройтись по нему с самого начала и удалить если следом идет копия но нужно сделать именно без сортировки..

ManInXRay
05-07-2006, 15:20

var
Src,Dst:TStrings;
Lookup:TStringList;
S:String;
i,Tmp:Integer;
begin
Lookup:=TStringList.Create;
Lookup.Sorted:=True;
Lookup.Duplicates:=dupIgnore;
Src:=Memo1.Lines;
Dst:=Memo2.Lines;
for i:=0 to Src.Count-1 do begin
S:=Src[i];
if Lookup.Find(S,Tmp) = False then begin
Lookup.Add(S);
Dst.Add(S)
end;
end;
Lookup.Free;
end;

Factor X
05-07-2006, 17:18
Спасибо конешно но здесь происходить процес сортировки листа
и соответвенно в мемо2 строки добавяться уже в другом порядке.
А необходимо просмореть всю мемо1 сначало до конца и проверить на совпадение каждую строку и в таком же порядке занести его в мемо2 тока без копий.

ManInXRay
05-07-2006, 17:23
Сортированный список Lookup используется только для быстрого поиска и отсечения дублирующихся строк.
Строки в Dst (Memo2) вставляются строго в порядке извлечения из Src (Memo1) БЕЗ СОРТИРОВКИ !!!

Алгоритм такой - если текущая строка есть в списке ранее добавленных, её уже не добавляем.

Правда, в указанной процедуре в результирующем списке остаётся первая копия строки.
Если нужно оставлять последнюю копию, тогда цикл надо сделать от конца к началу и текущую строку S добавлять не в конец результирующего списка, а в начало.

Miguelzx
05-07-2006, 17:52
Чувак похоже лабу в 9 классе здает. Нехорошо надо самому додумываться.

Factor X
06-07-2006, 17:59
Еще вопрос..
Почему когда в цикле пишу несколько условий и соединяю их "AND" получаеться ошибка(не принимаеться)

Пример:

var I:Integer;
Begin
for I:=0 to memo1.lines.count-1 do
if memo1.lines.string[i]=" " and memo2.lines.string[i]="0" and memo1.lines.string[i]='nil'
then memo1.lines.string[i]:="Не задан параметр";

3 Условия соединены между собой "AND" не принимает
Пишет: "[Error] Operator not applicable to this operand type"
Типо такой оператор не приемлем в данном операционном типе
Как осуществить? :confused:

Matr!x
06-07-2006, 21:20
нада в скобки взять...

потом у класса TStrings нет property "string". далее у тебя косяк с логикой: одновременно не может быть " " и "0" и 'nil', поэтому надо писать OR.
и еще в дельфи строки указываются в одинарных ковычках а не в двойных

вобщем будет так:

var I:Integer;
Begin
for I:=0 to memo1.lines.count-1 do
if (memo1.lines[i]=' ') OR (memo2.lines[i]='0') OR (memo1.lines[i])='nil')
then memo1.lines[i]:='Не задан параметр';

msq
06-07-2006, 21:29
Аффтар! Йад в аптеке! :D

MpaK999
06-07-2006, 21:42
жесть :)))) порадовали порадовали "пишу энд, а ошибки я читать не умею" :))) лол

SuperLight
06-07-2006, 22:19
Афтр - ЛАМЕР!

2Афтр - сколько тебе лет?
хватит заниматься ***ней! изучай алгоритмы и тренируйся на олимпиадных задачах. делфи выучить успеешь всегда

Factor X
07-07-2006, 22:01
Да про скобки уже все зделал заглянул сюда и тута тоже самое....Спасибо!
Время не было наспех калякал.Знаю куча косяков не разберал код
Кавычки да, знаю что одинарные.А с логикой все в порядке 0,nil,' ' может быть одновременно там много Мемо я грю мне суть ошибки and была важна вот и везде стоит мемо 1 а там 3,4,5 мемо их много и беруться из разных И string "s" забыл"
И хуле рас уж такая пьянка пошла придираться ко всему то одновременно ' ' и '0' может быть так как взяты они с разных мемо.А остальным бля со стороны с берега стоять смареть и смеяться легко как другой провалился хуле много ума не надо если такие шибко умные написали бы сюда что нить по теме
Но тем кто помог спасибо всеравно...

И еще такой вопрос: Как указать интервал в цикле

Пример (щас намано напишу ато придираетесь:p )

Var I: Integer;
Begin
For I: =0 to memo1.lines.count-1 do
if memo1.lines.strings[i]=memo1.lines.strings[i+1] //Вот здесь нужен скажем интервал условий чтоб проверил от [i+1] до [i+10]
then //................не важно что
end;
end.

Кто по теме откликнеться балгодарю :)

Matr!x
07-07-2006, 23:15
во-первых: для того, чтобы обратиться к строке из класса TStrings не надо писать lines.strings, если конечно не влом писать лишнее. читай хелп:
Use the Strings property to get or set the string at a particular position. Strings is the default property of TStrings objects. The Strings identifier can be omitted when accessing the Strings property of a descendant of TStrings.

во-вторых: в твоем примере так ниxyя работаь не будет, надо использовать вложенный цикл:

var
i,g:integer;
begin
for i:=0 to memo1.lines.Count - 1 do
for g:=1 to 10 do
if memo1.Lines[i] = memo1.Lines[i+g] then ...
end;

насчет and'ов извиняюсь - код смотрел наспех

Factor X
08-07-2006, 00:57
Спасибо Matr!x реально помог... Именно цикл в цикле хотел осуществить не получалось..
А вот в нашем примере массив начинаеться сначала тобишь с 0 до всех линей мемо1 идет просмотр, а как сделать просмотр с конца массива (с последней ячейки мемо1 и до начала массива до 0) Заранее спасибо.:)

Max Snake
08-07-2006, 01:07
ужос! аж страшно! Особо пугает название темы... :)

Matr!x
08-07-2006, 09:24
for i:=memo1.lines.count-1 downto 0 do

Factor X
08-07-2006, 16:48
Спасибо...
Возник снова вопрос
В мемо куча линий и есть пустые линии разбросаны по разному
как програмно пройтись по всем линиям и в Label вывести количество линий в мемо не учитывая пустые линии. Например всего линий 1500
а без учета пустых 1355 в метке Label вывести число Всего линий - "1355":)

Neyron
08-07-2006, 17:42
ну и ленивый же ты....

Factor X
09-07-2006, 18:39
Всем спасибо сделал

Factor X
09-07-2006, 18:51
Есть стринг грид(TStringGrid) В нем 2 колонки и множество строк в этих колонках. В первой колонк идут записи в виде дат, например: 05.06.2006
а во второй колонке идут просто названия организаций ('Организация')
Необходимо программно пройтись по всем организациям взять любую огранизацию и в той же строке только уже в колонке с датами посмореть дату и если она больше скажем "05.06.2006' выдать сообщение....
Заранее благодарен

Neyron
09-07-2006, 18:57
тебе палец в рот не клади...

Factor X
09-07-2006, 19:19
Есть стринг грид(TStringGrid) В нем 2 колонки и множество строк в этих колонках. В первой колонк идут записи в виде дат, например: 05.06.2006
а во второй колонке идут просто названия организаций ('Организация')
Необходимо программно пройтись по всем организациям взять любую огранизацию и в той же строке только уже в колонке с датами посмореть дату и если она больше скажем "05.06.2006' выдать сообщение....
Заранее благодарен кто поможет

Чтоб лентяем не называли вот собрал код он работет но делает не все
и взят TAdvStringGrid

var i:integer;
begin
for i:=0 to AdvStringGrid1.colcount-1 do
if (AdvStringGrid1.Cols[1].strings[i]='Организация')
and (AdvStringGrid1.Cols[0].Strings[i]='05.06.2006') //Вот здесь не получаеться преобразовать дату в цисло и поставить условие если > 05.06.2006 то показать сообщение! Как правильно записать преобразование strtoint или и поставить условие подскажите?
then ShowMessage('ааа');

Max Snake
09-07-2006, 20:10
перед сравнением даты\времени, преобразуй их в timestamp (кол-во секунда с какогото года)

или юзай CompareDateTime;
Call CompareDateTime to compare the two TDateTime values specified by A and B. CompareDateTime returns

LessThanValue if A is earlier than B.
EqualsValue if A is the same as B.
GreaterThanValue if A is later than B.

Factor X
09-07-2006, 21:48
:eek: :eek: :eek:
Чво такое понаписал? На каком эт языке нацарапано?:rolleyes:

Matr!x
09-07-2006, 23:16
на вот...

var
i:integer;
col1, col2 : string;
dt : TDateTime;
begin
for i:=0 to StringGrid1.RowCount - 1 do
begin
col1:=StringGrid1.Cells[0,i];
col2:=StringGrid1.Cells[1,i];
if TryStrToDate(col1,dt) then
if (dt > EncodeDate(2006,06,05)) and (col2 = 'Организация') then
ShowMessage('...');
end;
end;

Max Snake
10-07-2006, 00:26
это была цитата из хелпа на англицком :)


хех, я тя носом натыкал, а ты тока готовые листинги ждешь ?

а ты все таки лентяй... таким не место в программерах :)

Factor X
11-07-2006, 16:45
Ты такой умный что ли? Носом он тыкал....нафига мне тута твои тыкания нужны,я помощи просил! Я тебя и сам могу в хелп тыкнуть.Ели есть что реально по делу и помочь человеку то напишу для этого и нужны форумы. А типо (создай "ававаа" потом подгрузи "блблблб" затем сравни "всвсвсв" ) это я и без тебя знал. А если нечем помочь то никуда тыкать никого нинадо,таких тута тыкарей пруд пруди. И не тебе решать место мне в программерах или нет.
А вот MATR!Xу не человеческое СПАСИБО !!!....) :)

Snider
11-07-2006, 17:34
http://webhelp.ru/ - "Как правильно задавать вопросы".
Введение в этот текст - своего рода шедевр.

Max Snake
12-07-2006, 00:56
Полностью согласен с предыдущим оратором.

Фацтор Х
Научись искать инфу и думать. То, что ты тут просишь, это не "помощь", это "сделайте мне..."

Factor X
12-07-2006, 17:18
Я искал и есиб нашел ты как думаешь я написал бы тута?
И это "помощь "а не "сделай мне"!
И тебя чо просят силком что ли? еси такого рода помощь ты оцениваешь как "сделай мне" и тебе не хочеться этого делать я чо тебя заставляю что ли? Не пиши мля и не помогай!

Семь Сорок
12-07-2006, 17:24
может, ему нафиг не нужно прграммирование, а требуют. Зачем же сразу так...

Семь Сорок
12-07-2006, 17:38
Кстати, потратить больше времени и разобраться в чем-то самому гораздо полезнее, чем получить готовое на блюдечке. Любой программер со мной согласится :cool:

Factor X
12-07-2006, 17:51
Matr!x снова к тебе с вопросом.
Form3.StringGrid1.Cols[0].Assign(form1.StringGrid1.Cols[0]);
Form3.StringGrid1.Cols[0]:=form1.StringGrid1.Cols[0];
Form3.StringGrid1.Cols[0].AddStrings(Form1.StringGrid1.Cols[0]);

Любой из вариантов работает только добавляеться столько строк сколько есть на данный момент в Form3.StringGrid1.Cols[0] Тоесть не делаеться автоинсерт строк.
А так Form3.StringGrid1.assign(Form1.StringGrid1) - все работает нормально и добавляет полностью! Указываешь на колонку не получаеться
Добавляешь в начало так
Form3.StringGrid1.Rowcount:=Form1.StringGrid1.Rowcount
проблема решаться но все же почему так..

msq
12-07-2006, 21:22
Блят, Matr!x, начинай брать с него деньги :D

Factor X
12-07-2006, 22:33
Не все такие коварные и алчные как ты :p :rolleyes:

Matr!x
13-07-2006, 14:13
не понял. а в чем проблема? пиши сначала
Form3.StringGrid1.Rowcount:=Form1.StringGrid1.Rowcount
потом Form3.StringGrid1.Cols[0].Assign(form1.StringGrid1.Cols[0]);
это нормально