Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.08.20;
Скачать: CL | DM;

Вниз

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

 
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;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.053 c
2-1154421420
RomanH
2006-08-01 12:37
2006.08.20
SQL-запрос


2-1154522690
AlexanderMS
2006-08-02 16:44
2006.08.20
Ассоциация программы с файлами.


3-1149944456
lluha
2006-06-10 17:00
2006.08.20
Access и DBGrid


15-1153500115
Rgv54
2006-07-21 20:41
2006.08.20
Проблема с WordXP


5-1138109150
Юрий Ж.
2006-01-24 16:25
2006.08.20
[s]RxLib for Delphi2006