![]() |
Von fremder Form auf ListView zugreifen
Hallo!
Wieder einmal macht es Delphi mir nicht leicht. Wenn ich von einer fremden Form ein ListView leeren will passiert einfach nichts. Möchte ich den Text vom ersten Item in einem Label anzeigen bekomme ich folgende Fehlermeldung: Zitat:
Delphi-Quellcode:
procedure TForm2.Button1Click(Sender: TObject);
begin Label1.Caption := Form1.ListView1.Items[0].Caption; Form1.ListView1.Clear; end; |
Re: Von fremder Form auf ListView zugreifen
Hallo Alexander,
möglich ist es, aber die feine Art ist es nicht, wenn du auf diese Art auf UI-Controls zugreifst. Bei deinem Beispielcode musst du nur darauf achten, dass die andere Form (Form1) auch bereits instanziert wurde. Vermutlich hast du sie aus der Liste der automatisch erstellten Formulare heraus genommen. Grüße vom marabu |
Re: Von fremder Form auf ListView zugreifen
Hast du mal geschaut welchen Wert Form1 hat? Die Adresse deutet darauf hinn das du auf ein Object zugreifst welches nil ist
|
Re: Von fremder Form auf ListView zugreifen
Ich denke mal das ist nicht Delphi :mrgreen:
Entweder es trifft das zu was meine Vorredner gesagt habe, oder du hast vielleicht auch den Button zwei mal geklickt. Nach dem Zugriff löscht du ja das ListView. Danach ist Items[0] nil. Gruß oki |
Re: Von fremder Form auf ListView zugreifen
Habe definitiv nur einmal auf den Button geklickt. Sobald ich die ganze aktion
in der eigenen Form starte funktioniert es. Wobei kann es passieren, dass mein Object nil wird bzw. womit verhinder ich es? |
Re: Von fremder Form auf ListView zugreifen
Frag erst einmal ab, ob überhaupt Items vorhanden sind.
Delphi-Quellcode:
procedure TForm2.Button1Click(Sender: TObject);
begin if Form1.ListView1.Items.Count > 0 then begin Label1.Caption := Form1.ListView1.Items[0].Caption; Form1.ListView1.Clear; end; end; |
Re: Von fremder Form auf ListView zugreifen
Hi,
die Frage ist, was nil ist. Es kann sowohl die Form wie auch das Item sein. Die Form ist nil, wenn du wie schon erwähnt das Formular nicht automatisch erstellt wird. Da deine Form aber Form1 heißt, nehme ich mal an, dass das dein Hauptformular ist. Starte einfach mal das Programm aus der IDE und setze vorher einen Breakpoint in die erste Zeile deiner Ereignisbehandlung für Button Klick. Drücke auf den Button und die IDE geht in den Vordergrund. Dann kannst du mit der Maus über Form1 und den Eintrag Caption gehen. Schau mal, was der Debugger dazu sagt. Gruß Oki PS. Mann, wird zeit, dass wir ein Smiley für roten Kasten bekommen! |
Re: Von fremder Form auf ListView zugreifen
Form1 oder Form1.ListView1 können nicht nil sein, dafür ist die Fehleradresse viel zu niedrig.
|
Re: Von fremder Form auf ListView zugreifen
Na, wenn das so ist, dann kanns ja nur noch ein leeres ListView sein.
|
Re: Von fremder Form auf ListView zugreifen
Der Fehler kommt tatsächlich nur, wenn ich ein 2 mal auf den Button klicke. (grad noch einmal ausprobiert)
Das liegt ja dann daran das ich die ListView geleert habe. Allerdings stehen weiterhin alle einträge in der ListView. Wird die Komponente nicht aktualisiert oder was ist da bei der Anzeige los? Edit Vielleicht auch nicht leer, wenn ich nach dem leeren auf eins der Items da drinne klicke kann ich mir die Caption und ItemIndex anzeigen lassen. Versteh das grad alles nicht. -.- |
Re: Von fremder Form auf ListView zugreifen
Richtisch, einfach noch
Delphi-Quellcode:
aufrufen und schon sollte es gehen
Listview.Refresh;
hmmm ruf einfach mal das refresh auf, ma schaun was passiert... |
Re: Von fremder Form auf ListView zugreifen
Nichts passiert. :(
|
Re: Von fremder Form auf ListView zugreifen
kann doch gar nicht sein!! Wenn du das clear aufrufst muss das teil doch leer sein
zeig doch mal was du genau machst!! Hast du die abfrage von Deddy mit eingebaut?!? |
Re: Von fremder Form auf ListView zugreifen
Und bei
Delphi-Quellcode:
?
Form1.ListView1.Items.Clear;
|
Re: Von fremder Form auf ListView zugreifen
Auch hier leider kein erfolg.
Habe jetzt folgende Sachen ausprobiert. Form1.ListBox.Clear; Form1.ListBox.Items.Clear; das ganze mit und ohne Form1.ListBox.Refresh; Kann mir das ganze irgendwie nicht erklären. Habe jetzt auch schonmal einfach nen Test Projekt mit 2 Formen ausprobiert, dort funktioniert alles einwandfrei. Kann mir nur noch erklären, dass es irgendwo mit zusammen hängt das ich aus ner anderen Unit halt drauf zugreifen will. |
Re: Von fremder Form auf ListView zugreifen
zeig doch einfach mal den code!! Lässt du die formulare automatisch erstellen oder übernimmst du das?!?
|
Re: Von fremder Form auf ListView zugreifen
Welchen code willste denn sehen? Die Formulare habe ich mit der IDE und dem OI erstellt,
also nichts Dynamisches oder so. Das ganze wird ne kleine verwaltung mit mySql. Ich habe einmal eine Procedure mit der ich mein ListView fülle.
Delphi-Quellcode:
Die unit funktionen ist einfach nur eine Unit in dennen ich verschiedene proceduren und funktionen auslager.
// ausschnitt aus unit funktionen
procedure ListMedien(ListView: TListView); var q: String; ex: boolean; i: integer; begin if fMySql.Connect then begin if assigned(FResult) then begin if FMysql.Status<>MYSQL_STATUS_READY then FreeAndNil(FResult); end; q := 'SELECT * FROM medien'; fResult := fMySql.query(q,true,ex); ListView.Clear; // Liste leeren hier passiert jedoch nichts wenn ich das ganze aus Form2 aufrufe i := -1; fResult.First; while not fResult.Eof do begin i := i+1; ListView.Items.Add; ListView.Items[i].Caption := fResult.FieldValueByName('id'); ListView.Items[i].SubItems.Add(fResult.FieldValueByName('name')); ListView.Items[i].SubItems.Add(fResult.FieldValueByName('type')); ListView.Items[i].SubItems.Add(fResult.FieldValueByName('gerne')); ListView.Items[i].SubItems.Add(fResult.FieldValueByName('lager')); ListView.Items[i].SubItems.Add(fResult.FieldValueByName('verliehen')); fResult.Next; end; end; ListView.Refresh; FreeAndNil(fResult); end; Greife ich von meiner Form1 darauf zu, funktioniert das ganze. Jedoch von Form2 aus passiert nichts. Also habe ich mir den TestButton Button1 erstellt und einfach mal folgendes probiert.
Delphi-Quellcode:
// auch hiermit keinen erfolg
procedure TForm2.Button1Click(Sender: TObject); begin Label1.Caption := Form1.ListView.Items.Caption; // wahlweise im code beim 2. Buttonklick kommt eben der Fehler vom Thread anfang (siehe Zugriffsverletzung) Form2.ListView.Items.Clear; Form2.ListView.Refresh; end; |
Re: Von fremder Form auf ListView zugreifen
Das Form2 ist richtig?
|
Re: Von fremder Form auf ListView zugreifen
Ähh ne , Form1 gehört dahin. Habs nur schnell hier hin getippt.
|
Re: Von fremder Form auf ListView zugreifen
oben machst du
Delphi-Quellcode:
und unten
Listview.Clear;
Delphi-Quellcode:
ändere das untere mal...
Listview.Items.Clear;
ich hab das bei mir auch mal getestet und es klappt |
Re: Von fremder Form auf ListView zugreifen
Also, an dem Code ist nicht viel falsch zu machen. Wir können noch zwei Tage an den zwei Zeilen rumeiern. Du hast definitiv an einer anderen Stelle deines Projektes einen Fehler. Ob du nun zur Laufzeit Form1 "doppelt" kreierst oder sonst was machst. das ist reine Spekulation.
Gruß oki roter Katen! War doch klar :wall: |
Re: Von fremder Form auf ListView zugreifen
Heist dein ListView in Form1 wirklich ListView oder nicht doch ListView1?
|
Re: Von fremder Form auf ListView zugreifen
ListView stimmt so schon. Ich werd jetzt einfach mal alles neu machen und dann seh ich ja hoffentlich wo
der Fehler ist. =) ---- Edit ---- Habe einfach mal alles 1zu1 in ein neues Projekt kopiert so wie es aussieht scheint jetzt alles einwandfrei zu funktionieren. Woran auch immer das es liegen mag. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:41 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