Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Zugriff auf Scrollbox Objekte (https://www.delphipraxis.net/68894-zugriff-auf-scrollbox-objekte.html)

meg91 7. Mai 2006 19:20


Zugriff auf Scrollbox Objekte
 
Hallo
hab folgendes Problem:
ich erstelle Objekte auf einer Scrollbox und zwar ist das immer die gleiche Kombination, welche aus 3 Objekten besteht
jetzt hab ich versucht bei klick auf irgendeins dieser x-mal 3 Objekten eine Prozedur anzusprechen, die auf die caption des angelickten Objekts zugreifen soll
aber ich bekomme immer nur die caption des zuletzt erstellten Objekts

ich vermute mal das es mit den gleichen Namen der Objekte zusammen hängt

gibt es eine Möglichkeit die Namen irgendwie dynamisch zu ändern oder vllt soagr ne bessere Lösung

Gruß
meg

tigerman33 7. Mai 2006 21:39

Re: Zugriff auf Scrollbox Objekte
 
So wie es klingt erstellst du die drei Objekte immer in der gleichen Instanzenvariable, also in etwa so:

Delphi-Quellcode:
var Btn: TButton;

...

procedure NewBtn;
begin
...
  Btn := TButton.Create(ScrollBox);
...
end;

...
Damit wird bei jedem Aufruf von NewBtn zwar wie gewollt ein neues Button-Objekt erstellt, aber dieses "überschreibt" die jeweils vorherige Instanz. Du solltest deine Buttons in einem dyn. Array oder einer ObjectList verwalten, um auf alle erstellten Instanzen zugreifen zu können.

meg91 8. Mai 2006 09:34

Re: Zugriff auf Scrollbox Objekte
 
könntest du mir vllt ein konkretes Code Bsp geben, denn ich hab kein Plan wie das geh soll
Danke!

fkerber 8. Mai 2006 09:38

Re: Zugriff auf Scrollbox Objekte
 
Hi!

z.B. so:

Delphi-Quellcode:
var
  BtnArray: Array of TButton;
  i: integer;
begin
 setlength(BtnArray, 3)
 for i:=0 to length(BtnArray)-1 do
  begin
    BtnArray[i]:=Tbutton.Create;
    Btnarray[i].Parent:=Form1;
    ...
  end;
end;
War jetzt mal so ausm Kopf - also kein Gewehr ;)


Ciao Frederic

meg91 8. Mai 2006 12:40

Re: Zugriff auf Scrollbox Objekte
 
kann ich dann bei setlength die zahl immer ändern, denn ich weis im voraus nicht wie viel Objekte das werden?

fkerber 8. Mai 2006 12:43

Re: Zugriff auf Scrollbox Objekte
 
Hi!

Ich weiß ja nicht, wie du deine Buttons erstellst. Alternativ würde auch sowas gehen:

Delphi-Quellcode:
//beim erzeugen:
setlength(btnarray,0);

//VOR dem erzeugen eines neuen Buttons:
setlength(btnarray, length(btnarray)+1);
btnarray[high]:=TButton.Create;
...
wie immer ohne Schusswaffen... ;)


Ciao Frederic

meg91 8. Mai 2006 13:15

Re: Zugriff auf Scrollbox Objekte
 
erstmal vielen Dank
aber ich hab scho wieder ein Problem und zwar muss ich dann auch auslesen, welchen Namen das angeklickte objekt hat
die greifen nämlich alle auf dieselbe Prozedur zurück und ich muss dann die Aktion abhänig vom Namen machen, sprich welcher Button geklickt worden ist

fkerber 8. Mai 2006 13:37

Re: Zugriff auf Scrollbox Objekte
 
Hi!

Dann kannst du das über den Sender auslesen.
z.B. kannst du jedem Button einen anderen Tag setzen (es handelt sich dabei um einen Integer)

Delphi-Quellcode:
//z.B. so auslesen
if Sender is TButton then
  case (Sender as TButton).Tag of
   1: //Button mit Tag 1
   2: //Button mit Tag 2
  end;

Ciao Frederic

mbamler 8. Mai 2006 13:44

Re: Zugriff auf Scrollbox Objekte
 
Zitat:

Zitat von fkerber
Hi!

Dann kannst du das über den Sender auslesen.
z.B. kannst du jedem Button einen anderen Tag setzen (es handelt sich dabei um einen Integer)

Delphi-Quellcode:
//z.B. so auslesen
if Sender is TButton then
  case (Sender as TButton).Tag of
   1: //Button mit Tag 1
   2: //Button mit Tag 2
  end;

Ciao Frederic


Vergib nach dem Kreieren jeder Komponente einen eindeutigen Namen:
z.B. meinobjekt.name := 'Name' + IntToStr(i);

und dann beim Zugreifen mit FindComponent die jeweilige Komponente suchen:
z.B. for i := 1 to 10 do
TButton(FindComponent('Button' + IntToStr(i))).Visible := true;


Gruß
Matthias

fkerber 8. Mai 2006 13:49

Re: Zugriff auf Scrollbox Objekte
 
Hi!

Er will ja feststellen, welcher Button geklickt wurde, da alle die selbe Click-Procedure haben sollen.
Da geht das mit Sender sehr gut - mit FindComponent wohl eher nicht, er weiß nicht, was er "finden" soll.


Ciao Frederic

tigerman33 8. Mai 2006 13:56

Re: Zugriff auf Scrollbox Objekte
 
Ist außerdem nicht nur eleganter, sondern auch deutlich performanter als die Zuordnung über die Name-property!

meg91 8. Mai 2006 14:12

Re: Zugriff auf Scrollbox Objekte
 
hab jetzt folgendes in mein Prog eingebaut
Delphi-Quellcode:
var
  BtnArray: Array of TButton;
  i: integer;
begin
setlength(BtnArray, 3);
for i:=0 to length(BtnArray)-1 do
  begin
    BtnArray[i]:= Tbutton.Create;
    Btnarray[i].Parent:=Form3;
  end;
end;
aber ich bekomm da immer ne fehlermeldung:
[Fehler] Unit3.pas(34): E2035 Nicht genügend wirkliche Parameter

was ist denn da falsch?

fkerber 8. Mai 2006 14:13

Re: Zugriff auf Scrollbox Objekte
 
Hi!

Auf welche zeile bezieht sich der Fehler?

Ciao Frederic

Hawkeye219 8. Mai 2006 14:16

Re: Zugriff auf Scrollbox Objekte
 
@frederic
auf deinen Fehler aus Beitrag #6 :wink:

Die Methode Create braucht einen Parameter (den Owner)!

Gruß Hawkeye

tigerman33 8. Mai 2006 14:16

Re: Zugriff auf Scrollbox Objekte
 
Vermutlich auf die Zeile mit dem Konstruktor-Aufruf. Der müsste so aussehen:

Delphi-Quellcode:
BtnArray[i]:= Tbutton.Create(Form3);

fkerber 8. Mai 2006 14:17

Re: Zugriff auf Scrollbox Objekte
 
Hi!

Ich hatte ja gemeint, in welcher Zeile des Codes der Fehler auftritt.
Aber stimmt, das Create will wissen, wem das neue Control jetzt gehören soll.

Kommt davon, wenn man was aus dem Kopf schreibt.


Ciao Frederic

meg91 8. Mai 2006 14:32

Re: Zugriff auf Scrollbox Objekte
 
Liste der Anhänge anzeigen (Anzahl: 1)
hab das ganze grad ma in einem andere kleinen Prog getestet und es funzt super, nur wenn ichs bei mir einbaue bekomm ich immer nen Fehler während der Laufzeit
hier mal ein schnipsel source
Delphi-Quellcode:
var
  dateinamen_label: Array of TLabel;
  zaehler :integer = -1;
implementation

{$R *.dfm}

procedure TForm1.list_results(picture: string; text_1:string; text_2:string);
begin
zaehler := zaehler + 1;
setlength(dateinamen_label, zaehler + 2);
 {...}
with dateinamen_label[zaehler + 1] do
begin
  dateinamen_label[zaehler + 1] := TLabel.Create(self);
  Parent := ScrollBox1;
  Cursor := crHandPoint;
  OnClick := p_openlink;
  Tag := zaehler + 1;
  Font.Color := $009A570C;
  Font.Style := [fsBold, fsUnderline];
  Caption := text_1;
  Top := 40 * zaehler;
  Left := 30;
end;
 {...}
end;

procedure TForm1.p_openlink(Sender: TObject);
var
  i_labelnumber: integer;
begin
  if Sender is TLabel then
  i_labelnumber := (Sender as TLabel).Tag;

  ShellExecute(0,'open', pchar(linkliste[i_labelnumber]),nil,nil,SW_SHOWNORMAL);;
end;
aus irgendeinem Grund erstellt der das Label nicht

fkerber 8. Mai 2006 14:33

Re: Zugriff auf Scrollbox Objekte
 
HI!

Verrätst du uns auch, was für ein Fehler kommt?


Ciao Frederic

meg91 8. Mai 2006 14:53

Re: Zugriff auf Scrollbox Objekte
 
Die Meldung ist bei meinem letzen Posting im Anhang und außerdem kommt nach der noch eine Fehlermelung mit einer Zugriffsverletzung
keine Ahnung was ich da angestellt hab

Hawkeye219 8. Mai 2006 15:00

Re: Zugriff auf Scrollbox Objekte
 
Zitat:

Zitat von meg91
Delphi-Quellcode:
with dateinamen_label[zaehler + 1] do
begin
  dateinamen_label[zaehler + 1] := TLabel.Create(self);
  [...]
  Tag := zaehler + 1;
end;

Die Verwaltung des Zählers ist etwas undurchsichtig. Warum verwendest du an den obigen Stellen den Wert "zaehler +1"?
Bei deiner Zählweise wäre doch "zaehler" der richtige Wert, oder? :gruebel:

Gruß Hawkeye

meg91 8. Mai 2006 15:06

Re: Zugriff auf Scrollbox Objekte
 
ja stimmt, da hab ich mich ein bisschen vertan mit dem +1
aber das war leider nicht der Fehler

Hawkeye219 8. Mai 2006 15:14

Re: Zugriff auf Scrollbox Objekte
 
Vielleicht enthält der übergebene Parameter text_1 einen Leerstring. In diesem Fall hat das Label wahrscheinlich die Länge 0 und ist damit nicht sichtbar.

Gruß Hawkeye

meg91 8. Mai 2006 15:15

Re: Zugriff auf Scrollbox Objekte
 
hab ich mir auch schon gedacht, is aber nich der Fall

fkerber 8. Mai 2006 15:16

Re: Zugriff auf Scrollbox Objekte
 
Hi!

Setz doch mal einen Breakpoint und geh zeilenweise durch, um festzustellen, wo die AV auftritt...


Ciao Frederic

meg91 8. Mai 2006 15:32

Re: Zugriff auf Scrollbox Objekte
 
der Fehler scheint nach Parent := ScrollBox1; zu kommen

hab gleich noch was getestet und zwar habe ich den ganzen Block
Delphi-Quellcode:
with dateinamen_label[zaehler] do
begin
[...]
end;
auskommentiert und dann geht das Programm einwandfrei

fkerber 8. Mai 2006 15:34

Re: Zugriff auf Scrollbox Objekte
 
Hi!

Sicher, dass es zu diesem Zeitpunkt die Scrollbox1 schon gibt. Außerdem könnte es sein, dass er da was falsches "sucht" wegen der with-Anweisung. Versuch mal ne Zuweisung nach dem Motto Form1.Scrollbox1.


Ciao Frederic

meg91 8. Mai 2006 15:40

Re: Zugriff auf Scrollbox Objekte
 
hey super :-D
das war mein Fehler
vilen, vielen Dank
ich hab jetzt überall dateinamen_label[zaehler]. anstatt with do und es funzt

kannst du mir das jetzt vllt auch noch logisch erklären, denn mit with do sollte es teoretisch doch auch gehn

fkerber 8. Mai 2006 15:42

Re: Zugriff auf Scrollbox Objekte
 
Hi!

Dann versucht er aber folgendes:

Delphi-Quellcode:
dateinamen_label[zaehler].parent:=dateinamen_label[zaehler].scrollbox1;
Das geht dann wohl schief...


Ciao Frederic

Hawkeye219 8. Mai 2006 15:49

Re: Zugriff auf Scrollbox Objekte
 
:shock: Hey Frederic, da hast du aber einen ganz bösen (und gut versteckten) Fehler entdeckt!
In der Zeile mit dem WITH kopiert Delphi einen NIL-Zeiger in eine lokale Variable und arbeitet damit weiter.
Das Feldelement wird erst in der Zeile danach initialisiert....

Hawkeye


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:47 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz