View Full Version : [delphi] Come si fa ad accedere indirettamente agli oggetti?
se ad esempio ho diversi oggetti appartenenti alla classe Tedit:
edit1,
edit2,
edit3.
Voglio cambiare la scritta all'interno di ogni casella senza dover scrivere:
edit2.caption:='efwer';
ma scrivendo qualcosa del tipo(solo che così non funziona):
var a:integer;
begin
a:=2;
edit(a).caption:='rfer';
end;
come si fa?
grazie, ciao
ilsensine
12-07-2006, 16:26
Non si fa, a meno che non crei e inizializzi (ad es. alla creazione della form) un array di TEdit, che puoi dunque indicizzare.
Infatti ho provato a fare così e funziona:
var aa: array[1..10] of tedit
begin
aa[1]:=tedit.create(self);
aa[1].parent:=self;
end;
soltanto che in questo modo non posso controllare le caselline che ho disegnato con il mouse, ma posso solo crearne da codice e poi controllarle.
Inoltre se voglio gestire gli eventi come faccio?
esempio:
procedure tform1.aa[a]onkeyPress (sender:tobject; var key:char);
non funziona ovviamente, ma qualcosa del genere come faccio ad ottenerlo?
grazie
ilsensine
13-07-2006, 09:09
Infatti ho provato a fare così e funziona:
var aa: array[1..10] of tedit
begin
aa[1]:=tedit.create(self);
aa[1].parent:=self;
end;
No; instanzia un array tra le variabili della tua form:
var edits: array[1..3] of TEdit;
nel metodo di creazione della form la inizializzi con le tedit della form che ti interessano:
edits[1] := edit1;
edits[2] := edit2;
edits[3] := edit3;
quindi ci accedi normalmente con array[index].
soltanto che in questo modo non posso controllare le caselline che ho disegnato con il mouse, ma posso solo crearne da codice e poi controllarle.
Inoltre se voglio gestire gli eventi come faccio?
Creare dinamicamente gli oggetti è possibile, ma devi installare a mano gli event handlers.
Ad sempio:
var e: TEdit;
...
e := TEdit.Create(Self);
e.onKeyPress := myKeyPressHandler;
Grazie, stasera provo. Ciao
Morpheus_/_Neo
14-07-2006, 00:27
scusa, sono anni che nn ci lavoro, ma in delphi la classe form nn ha un metodo del tipo getComponentbyName? forse fa quello che chiedi tu... ma potrei sbagliarmi
M_/_N
Morpheus_/_Neo
14-07-2006, 00:42
prova vedere questo:
yes, you can make an array of tlabel, but then you have to assign all values
manually in code, like position...
other idea is to make an array of pointer to tlabel and anly assign the
address of your labels to that array. than you can place them in the ide and
at run time access them via array.
or, another idea name them all like label1,label2,label3,...
then you can itterate trough them by with a for and the function
componentbyname. more in delphi help file.
hope it helps.
M_/_N
Morpheus_/_Neo
14-07-2006, 00:55
rettifico, la funzione che ti avevo postato sembra non esitere piu' in delphi... boh...
ho provato appena ora con delphi7 questo codice:
procedure TForm1.FormCreate(Sender: TObject);
var x: tedit;
begin
x := form1.FindComponent('edit1') as tedit;
x.Text := 'ok';
end;
nella form1 avevo messo un tedit di nome edit1... modifica a piacere per fare quello che chiedevi tu iterando sulla stringa 'edit' + i
Perfetto, è quello che mi serviva, solo che adesso ho un'altro problema:
var x: array[1..10] of tedit;
...
x[a]:= form1.FindComponent('edit1') as tedit;
x[a].onKeyPress := myKeyPressHandler;
procedure mykeypresshandler (sender:tobject; var key:char);
begin
'Adesso come faccio a capire quale dei 10 x[a] ha generato l'evento?
end;
Grazie, Ciao :)
ilsensine
14-07-2006, 10:13
scusa, sono anni che nn ci lavoro, ma in delphi la classe form nn ha un metodo del tipo getComponentbyName? forse fa quello che chiedi tu... ma potrei sbagliarmi
Per me l'uso di questa tecnica è NAK in questo caso.
Poi Das fai come preferisci ;)
ilsensine
14-07-2006, 10:19
var x: array[1..10] of tedit;
...
x[a]:= form1.FindComponent('edit1') as tedit;
Con un veloce
x[a] := edit1;
hai in un botto:
- controllo sul tipo (nessun cast necessario)
- se alla edit1 cambi nome, te ne accorgi immediatamente in quanto hai un errore di compilazione
x[a].onKeyPress := myKeyPressHandler;
Non è necessaria; basta che implementi l'handler della tua edit1 "graficamente".
Ricorda che edit1 _non_ è l'oggetto, è un reference all'oggetto, quindi non devi fare nulla che non hai già fatto quando hai definito l'oggetto e il suo comportamento.
E' diverso il caso in cui crei dinamicamente l'oggetto da codice: ottieni il reference a un oggetto di default, senza handler definiti, e devi "riempirlo" runtime.
procedure mykeypresshandler (sender:tobject; var key:char);
begin
'Adesso come faccio a capire quale dei 10 x[a] ha generato l'evento?
Il parametro "sender" qui dovrebbe essere la tua tedit
grazie, sono riuscito a far funzionare tutto alla perfezione.
Ciao
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.