Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2006.08.20;
Скачать: [xml.tar.bz2];

Вниз

Присвоение процедуры   Найти похожие ветки 

 
Adios ©   (2006-07-24 00:06) [0]

function link(name:string):string;
begin
x:=x+1;
New:=Tlabel.Create(form1.ScrollBox);
New.Top:= 0;
New.Left:=0;
new.Align:=alTop;
new.Alignment:=taCenter;
new.Font.Size:=12;
new.Font.Name:="Uk_Arbat";
new.WordWrap:=true;
new.AutoSize:=true;
new.Transparent:=true;
new.Cursor:=crHandPoint;
New.Name:="label"+inttostr(x);
new.Caption:=SearchRec.name;
new.OnClick:=ClickLabel;
New.Parent:=form1.ScrollBox;
end;

Procedure tform1.ClickLabel( Sender : TObject );
begin
showmessage(TControl(Sender).name);
end;

вопрос:
почему созданые лабелы не реагируют на событие ClickLabel?
а если написать form1.onclick:=ClickLabel;
то реакция при нажатии на форму есть?


 
KilkennyCat ©   (2006-07-24 00:16) [1]

Родитель строгий, наверное...


 
Adios ©   (2006-07-24 00:20) [2]

так ведь реакция на событие онклик у Тлабела есть, может я сам чтото накосячил?


 
Джо ©   (2006-07-24 00:21) [3]

Ошибка, возможно, где-то в другом месте кода или в неверном использовании приведенного. Кстати, именно приведенный код даже не скомпилируется. И он довольно небрежен. Из-за этого тоже может возникнуть ошибочная ситуация. Например, использование ссылки на глоб. переменную form1. Но, пока нет РЕАЛЬНОГО кода судить не о чем, ИМХО.


 
Footballer ©   (2006-07-24 00:31) [4]

Да, действительно, код не компилится, приведи код по-подробнее...
Примечание вместо x:=x+1 правильнее писать inc(x) (Увеличивает переменную на 1)


 
Zeqfreed ©   (2006-07-24 00:42) [5]

> Примечание вместо x:=x+1 правильнее писать inc(x)

Что значит правильнее?


 
Adios ©   (2006-07-24 00:47) [6]

unit main;

interface

uses
 Windows, ShellApi, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls, ExtCtrls, ComCtrls, jpeg, TeeProcs, TeEngine,
 Chart, DBCtrls, AxCtrls, OleCtrls, VCF1, FileCtrl, Grids, DBGrids,
 dblookup, Tabs, Menus, Buttons;

type
 TForm1 = class(TForm)
   Panel1: TPanel;
   ScrollBox: TScrollBox;
   Panel2: TPanel;
   Panel3: TPanel;
   Procedure ClickLabel( Sender : TObject );
   procedure FormCreate(Sender: TObject);
   procedure FormClose(Sender: TObject; var Action: TCloseAction);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

var
 Form1: TForm1;
 SearchRec:TSearchRec;
 dir:string;
 z:hwnd;
 path:string;
 foo: TPoint;
 New : Tlabel;
 x:integer;
 ClickLabel:TNotifyEvent;
implementation

{$R *.dfm}
function gamelink(name:string):string;
begin
x:=x+1;
New:=Tlabel.Create(form1.ScrollBox);
New.Top:= 0;
New.Left:=0;
new.Align:=alTop;
new.Alignment:=taCenter;
new.Font.Size:=12;
new.Font.Name:="Uk_Arbat";
new.WordWrap:=true;
new.AutoSize:=true;
new.Transparent:=true;
new.Cursor:=crHandPoint;
New.Name:="label"+inttostr(x);
new.Caption:=SearchRec.name;
new.OnClick:=ClickLabel;
New.Parent:=form1.ScrollBox;
end;

Procedure tform1.ClickLabel( Sender : TObject );
begin
showmessage(TControl(Sender).name);
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
form1.OnClick:=ClickLabel;
AddFontResource(PChar("Uk_Arbat.ttf"));
SendMessage(HWND_BROADCAST,WM_FONTCHANGE,0,0);
Dir:="install";
x:=0;
if Dir<>"" then if Dir[length(Dir)]<>"\" then Dir:=Dir+"\";
if FindFirst(Dir+"*.*", faAnyFile, SearchRec)=0 then
repeat
if (SearchRec.name=".") or (SearchRec.name="..") then continue;
if ((SearchRec.Attr and faDirectory)<>0) or (extractfileext(SearchRec.name)=".exe") then
gamelink("gfh")
until FindNext(SearchRec)<>0;
FindClose(SearchRec);
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
RemoveFontResource(PChar("Uk_Arbat.ttf"));
SendMessage(HWND_BROADCAST,WM_FONTCHANGE,0,0);
end;

end.


 
GrayFace ©   (2006-07-24 00:49) [7]

Удобнее при длинном имени переменной и к указателям применим.


 
Footballer ©   (2006-07-24 00:49) [8]

Ну не просто же так создана процедура inc :)


 
Footballer ©   (2006-07-24 00:51) [9]


> Footballer ©   (24.07.06 00:49) [8]

Это я к [5]


 
Adios ©   (2006-07-24 01:01) [10]

_


 
Adios ©   (2006-07-24 01:10) [11]

да, если создать лабел в редакторе и написать
label1.OnClick:=ClickLabel;
то реакция происходит, а на созданные програмно метки нет никакой реакции, хотя сами метки корректно создаются с заданными параметрами


 
Footballer ©   (2006-07-24 01:20) [12]

Пробовал так:
new.OnClick:=Form1.FormCreate;
Реакция была...
Вывод: созданные програмно объекты не реагирают на созданные програмно процедуры, не знаю почему :( (Может ошибаюсь, но вывод напрашивается такой)


 
Adios ©   (2006-07-24 01:27) [13]

Ответ на мой вопрос выглядит так:
new.OnClick:=form1.ClickLabel;


 
Германн ©   (2006-07-24 01:31) [14]


> var
...
ClickLabel:TNotifyEvent;


А это за каким тут появилось?
И ессно функция gamelink, не привязанная к форме, на строке new.OnClick:=ClickLabel; берёт именно содержимое этой переменной, а оно хрен знает какое, но уж точно не имеет никакого отношения к Procedure tform1.ClickLabel( Sender : TObject );


 
Джо ©   (2006-07-24 01:31) [15]

> [13] Adios ©   (24.07.06 01:27)
> Ответ на мой вопрос выглядит так:
> new.OnClick:=form1.ClickLabel;

Совет обратить внимание на использование глоб. переменной form1 был дан еще в посте [3]. И Ваше, так называемое "решение" является, образно говоря, добровольным выкапыванием себе ямы.


 
Footballer ©   (2006-07-24 01:36) [16]


> Ответ на мой вопрос выглядит так:

Я чё-то не догоняю, это вы ответили на свой же вопрос???


 
Германн ©   (2006-07-24 01:41) [17]

Насчёт "выкапывания себе ям" и я ещё добавлю. А на кой надо было gamelink делать функцией юнита? Чем не устроило сделать её методом формы? Ведь в ней создаются новые компоненты для этой формы!


 
Adios ©   (2006-07-24 01:48) [18]


> Footballer

да это ответ на мой вопрос.
> Германн

я в душе даже не представляю что такое метод формы
> Джо

можно спросить скока вы делфя изучаете?


 
Германн ©   (2006-07-24 01:59) [19]


> я в душе даже не представляю что такое метод формы


Ну тогда прочитай сначала ну хоть какую нибудь книжку по Делфи. Пусть даже это будет Архангельский! Пусть даже не всю целиком, а хотя бы треть или четверть.


 
GrayFace ©   (2006-07-28 00:58) [20]

Adios ©   (24.07.06 1:48) [18]
я в душе даже не представляю что такое метод формы

Если представляешь, что такое указатель, могу объяснить.


 
ЮЮ ©   (2006-07-28 02:52) [21]


> Adios ©   (24.07.06 1:48) [18]
> я в душе даже не представляю что такое метод формы


Но ведь используешь!
Procedure tform1.ClickLabel( Sender : TObject ); - метод ClickLabel фомы класса TForm1.

Аналогично поступай и с  link:

TForm1 = class(TForm)
...
private
  { Private declarations }
  function gamelink(name:string):string;
public
  { Public declarations }
end;

...

function  tform1.gamelink(name:string):string;
var
  New : Tlabel;

begin
x:=x+1;
New:=Tlabel.Create(ScrollBox);
New.Top:= 0;
New.Left:=0;
new.Align:=alTop;
new.Alignment:=taCenter;
new.Font.Size:=12;
new.Font.Name:="Uk_Arbat";
new.WordWrap:=true;
new.AutoSize:=true;
new.Transparent:=true;
new.Cursor:=crHandPoint;
New.Name:="label"+inttostr(x);
new.Caption:=SearchRec.name;
new.OnClick:=ClickLabel;
New.Parent:=ScrollBox;
end;


и от глобальных переменных
var
  SearchRec:TSearchRec;
  dir:string;
  z:hwnd;
  path:string;
  foo: TPoint;
  New : Tlabel;
  x:integer;
  ClickLabel:TNotifyEvent;
избавься раз и навсегда. Или локальные для методов или поля формы - туда же где function gamelink


 
GrayFace ©   (2006-07-28 07:17) [22]

ЮЮ ©   (28.07.06 2:52) [21]
и от глобальных переменных избавься раз и навсегда. Или локальные для методов или поля формы - туда же где function gamelink

У полей форм есть один недостаток - им нельзя задать начальное значение. По этому не надо избавляться - так удобнее.


 
ЮЮ ©   (2006-07-28 07:28) [23]


> У полей форм есть один недостаток - им нельзя задать начальное
> значение.


Для этих целей есть конструктор. Для внешнего доступа делаются соответствующие свойства. А вот при использовании хотя бы двух экземпляров формы, использующих одни и теже глобальные переменные, жди "удобств" в полной мере


 
GrayFace ©   (2006-07-29 01:52) [24]

ЮЮ ©   (28.07.06 7:28) [23]
Для этих целей есть конструктор.

Вот я и говорю - неудобно. По-моему, нет в этом смысла, если не предвидится
хотя бы двух экземпляров формы.



Страницы: 1 вся ветка

Форум: "Начинающим";
Текущий архив: 2006.08.20;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.51 MB
Время: 0.054 c
2-1154348555
Neket
2006-07-31 16:22
2006.08.20
IdSNMP1


10-1122960775
Dell3r
2005-08-02 09:32
2006.08.20
Файлы типа .doc в один файл


2-1154415522
ANB
2006-08-01 10:58
2006.08.20
Как узнать имя сертификта в контейнере (дискета) через CryptoAPI?


2-1152303671
Pavia
2006-07-08 00:21
2006.08.20
Спец эфекты.


15-1152883380
pasha_golub
2006-07-14 17:23
2006.08.20
ShortLine





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский