![]() |
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 |
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:
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.
var Btn: TButton;
... procedure NewBtn; begin ... Btn := TButton.Create(ScrollBox); ... end; ... |
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! |
Re: Zugriff auf Scrollbox Objekte
Hi!
z.B. so:
Delphi-Quellcode:
War jetzt mal so ausm Kopf - also kein Gewehr ;)
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; Ciao Frederic |
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?
|
Re: Zugriff auf Scrollbox Objekte
Hi!
Ich weiß ja nicht, wie du deine Buttons erstellst. Alternativ würde auch sowas gehen:
Delphi-Quellcode:
wie immer ohne Schusswaffen... ;)
//beim erzeugen:
setlength(btnarray,0); //VOR dem erzeugen eines neuen Buttons: setlength(btnarray, length(btnarray)+1); btnarray[high]:=TButton.Create; ... Ciao Frederic |
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 |
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 |
Re: Zugriff auf Scrollbox Objekte
Zitat:
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 |
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 |
Re: Zugriff auf Scrollbox Objekte
Ist außerdem nicht nur eleganter, sondern auch deutlich performanter als die Zuordnung über die Name-property!
|
Re: Zugriff auf Scrollbox Objekte
hab jetzt folgendes in mein Prog eingebaut
Delphi-Quellcode:
aber ich bekomm da immer ne fehlermeldung:
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; [Fehler] Unit3.pas(34): E2035 Nicht genügend wirkliche Parameter was ist denn da falsch? |
Re: Zugriff auf Scrollbox Objekte
Hi!
Auf welche zeile bezieht sich der Fehler? Ciao Frederic |
Re: Zugriff auf Scrollbox Objekte
@frederic
auf deinen Fehler aus Beitrag #6 :wink: Die Methode Create braucht einen Parameter (den Owner)! Gruß Hawkeye |
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);
|
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 |
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:
aus irgendeinem Grund erstellt der das Label nicht
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; |
Re: Zugriff auf Scrollbox Objekte
HI!
Verrätst du uns auch, was für ein Fehler kommt? Ciao Frederic |
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 |
Re: Zugriff auf Scrollbox Objekte
Zitat:
Bei deiner Zählweise wäre doch "zaehler" der richtige Wert, oder? :gruebel: Gruß Hawkeye |
Re: Zugriff auf Scrollbox Objekte
ja stimmt, da hab ich mich ein bisschen vertan mit dem +1
aber das war leider nicht der Fehler |
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 |
Re: Zugriff auf Scrollbox Objekte
hab ich mir auch schon gedacht, is aber nich der Fall
|
Re: Zugriff auf Scrollbox Objekte
Hi!
Setz doch mal einen Breakpoint und geh zeilenweise durch, um festzustellen, wo die AV auftritt... Ciao Frederic |
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:
auskommentiert und dann geht das Programm einwandfrei
with dateinamen_label[zaehler] do
begin [...] end; |
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 |
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 |
Re: Zugriff auf Scrollbox Objekte
Hi!
Dann versucht er aber folgendes:
Delphi-Quellcode:
Das geht dann wohl schief...
dateinamen_label[zaehler].parent:=dateinamen_label[zaehler].scrollbox1;
Ciao Frederic |
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 01:46 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz