IPB
ЛогинПароль:

> ВНИМАНИЕ!

Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.

> Событие для динамически созданного компонента
sheka
сообщение 31.07.2010 23:23
Сообщение #1


Я.
****

Группа: Пользователи
Сообщений: 809
Пол: Мужской
Реальное имя: Саша

Репутация: -  11  +


Продолжнение "Вызывает антирес и такой ишо разрез"
Как можно осуществить событие для динамически созданного компонента? Проблема в том, что программа модульная и "процедура не описана как метод формы".
procedure MyOnClick(Sender: TObject);
begin
form1.Label1.Caption:=inttostr(form1.MainMenu1.Items.IndexOf(sender as TMenuItem));
end;

procedure CreateSubMenu(MainMenu: TMainMenu; p: TP);
var
i,j: integer;
k: longint;
N: TMenuItem;
begin
k:=3;
//...
SetLength(MenuItemArray, 2, k);
for j:=0 to k-1 do
for i:=0 to 1 do
begin
N:=TMenuItem.Create(MainMenu);
n.Caption:=inttostr(i)+inttostr(j);
n.OnClick:=MyOnClick; //вот здесь пишет Incompatible types: 'method pointer and regular procedure'
MainMenu.Items[i+1].items[1].Insert(j,n);
MenuItemArray[i][j]:=n;
end;
end;

Сама программа: Прикрепленный файл  VstupInfo.rar ( 275.13 килобайт ) Кол-во скачиваний: 417


Сообщение отредактировано: sheka - 31.07.2010 23:24
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
volvo
сообщение 1.08.2010 15:10
Сообщение #2


Гость






Итак, я нашел, что не давало открывать проект в D2009 - одно из свойств TIdHTTP уже отсутствует, поэтому проект не открывался. Открыл. Посмотрел... Могу подсказать, что надо будет сделать, чтобы оно заработало в 2009/2010, если тебя интересует (в том виде, в котором это сейчас - оно не очень-то работает, только при совпадении некоторых условий, а это плохой стиль программирования). Но это - не главное, что я хотел сказать. Главное - в другом.

У тебя парсинг сделан "в лоб". А зачем? Можно же воспользоваться средствами, которые тебе предоставляет Дельфи, и тогда вот это:

Цитата
procedure FindWreckersOnline(var Memo: TMemo;source: string);
var
prev,i: longint;
s,n,m: string;
poem: ansistring;
begin
// ... тут - получение строки Poem
prev:=0;
while PosEx('<tr><td>',poem,prev+1)<>0 do
begin
s:='';
prev:=PosEx('<tr><td>',poem,prev+1);
for i:=prev to PosEx('</td></tr>',poem,prev) do
s:=s+poem[i];
for i:=1 to 6 do
delete(s,pos('<',s),pos('>',s)-pos('<',s)+1);
n:='';
i:=1;
while s[i] in Digits do
begin
n:=n+s[i];
inc(i);
end;
delete(s,1,length(n));
i:=1;
while (s[i] in Letters)or (s[i]=' ') do
inc(i);
m:='';
while s[i] in Digits do
begin
m:=m+s[i];
inc(i);
end;
delete(s,pos('<',s)-length(m),length(s)-pos('<',s)+length(m)+1);
Memo.Lines.Append(Format('%-5s',[n])+Format('%-7s',[m])+s);
end;
end;
Станет вот этим:

procedure FindWreckersOnline(var Memo: TMemo; source: string);
var
// ...
poem: string;
i, start, finish, counter: integer;
SL: TStringList;
begin
// Получение Poem с сайта
start := PosEx('<tbody>', Poem) + Length('<tbody>'#$A'<tr><td>');
finish := PosEx('</table>', Poem, start);
Poem := Copy(Poem, start, finish - start);

SL := TStringList.Create;
try
Poem := StringReplace(Poem, ' ', '_', [rfReplaceAll]);
Poem := StringReplace(Poem, #$A'<tr><td>', '|', [rfReplaceAll]);
Poem := StringReplace(Poem, '</td><td>', '|', [rfReplaceAll]);
Poem := StringReplace(Poem, '</td></tr>', '', [rfReplaceAll]);

SL.Delimiter := '|'; SL.DelimitedText := Poem;
counter := pred(SL.Count div 6);

Memo.Lines.BeginUpdate;
for i := 0 to counter do
begin
Memo.Lines.Add(Format('%-5s%-7s %s',
[SL.Strings[6*i + 0],
StringReplace(SL.Strings[6*i + 1], '_', ' ', [rfReplaceAll]),
SL.Strings[6*i + 2]]));
end;
Memo.Lines.EndUpdate;

finally
SL.Free;
end;
end;
Ошибиться, как видишь, практически негде... Работает абсолютно так же, как твой код, только я один пробел (между фамилией и баллом, добавил, чтоб лучше смотрелось) smile.gif
 К началу страницы 
+ Ответить 

Сообщений в этой теме


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



- Текстовая версия 14.07.2025 14:56
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"