![]() |
Re: Komponenten freigeben - Invalid pointer operation
JA der besitzer!
Habe ihn mal geändert auf Form1.PageControl1.ActivePage weil die Boxen da drauf liegen! das Problem beim schliessen bleibt aber trotzdem! |
Re: Komponenten freigeben - Invalid pointer operation
OK, das haben wir also rausgefunden. Und jetzt guck dir noch mal Beitrag #4 in diesem Thread von mir an.
|
Re: Komponenten freigeben - Invalid pointer operation
ist ja schön und gut!
möchte jetzt aber nicht erst beim beenden die komponenten freigeben, sondern auch mal wenn ich sonst auf einen button klicke weil ich dan alles reseten möchte! Zudem kommt auch beim beenden immer noch dieser Invalid pointer operation!!!!!!!!!!!!!!!!!!!!!!!!! |
Re: Komponenten freigeben - Invalid pointer operation
Zitat:
PS: Ein Ausrufezeichen reicht. |
Re: Komponenten freigeben - Invalid pointer operation
... und warum lässt du den Index 0 in der der 2. Dimension deines Arrays mybox1 ungenutzt?
|
Re: Komponenten freigeben - Invalid pointer operation
Hallo Michael,
wenn ich unter einem Owner (z.B. eine Groupbox) dynamisch 5 Komponenten erstelle (z.B. Labels) die ich mit Wegwerfnamen versehe, wie kann ich dann diese 5 Labels wieder freigeben um sie eventuell nach einen Datenrefesh wieder ebenso neu zu erstellen? Gruß, Christoph |
Re: Komponenten freigeben - Invalid pointer operation
Zitat:
Warum Labels freigeben um sie dann wieder zu erzeugen? Warum nicht einfach den Labels den neuen Inhalt zuweisen? Dies könntest du sogar in deinem Akualisierungscode einbringen. Dieser müsste die Labels nur dann erzeugen, wenn er noch keine Instanzen hat. Wenn er sie erzeugt vermerkt er sie sich einfach. Ein Label freigeben und neu erzeugen macht die Anwendung nur unnlötig langsamer. Wenn du mir den Code zeigst wo du die Labels erstellst und mit Datenbankwerten füllst (die Datenbank dinge kannste weglassen), dann könnte ich dir den Code wahrscheinlich umstellen um es nach meinem Vorschlag abzuarbeiten. |
Re: Komponenten freigeben - Invalid pointer operation
Zitat:
Das mit den Labels war beispielhaft gemeint. Mein Programm macht etwas anderes: Ich habe eine Liste von Objekten deren Id eine Guid ist. Initial erzeuge ich aus der Liste mehrere Buttons innerhalb einer Groupbox, in den Namen des Buttons arbeite ich die Guid ein und der Button zeigt einen Namen (Str) des Objektes an. Wenn ein Button gedrückt wird, soll eine bestimmte Aktion ausgelöst werden, zu der es aber notwendig ist, das inhaltlich zum Button gehörende Objekte zu wissen (löse ich über den Buttonnamen anhand der Guid). Hier mal der Code zu Erzeugen der Buttons:
Delphi-Quellcode:
und hier die Click-Behandlung:
procedure TMainForm.Create_Selection_Buttons;
var _Button: TButton; i, ypos, xpos: integer; _Activity:TActivity; begin ypos := 15; xpos := 10; for i := 0 to self.fObjManager.ActivityList.Count-1 do begin _Activity:=TActivity(self.fObjManager.ActivityList.Objects[i]); // neuer button _Button:=TButton.Create(Self); with _Button do begin Parent:=MainForm.gbActivitySelection; Caption:=_Activity.Name; Left:=xpos; Top:=ypos; Width:= MainForm.gbActivitySelection.Width - xpos - xpos; Name:=_Activity.GUID_ComponentName; OnClick:=Selection_Buttons_Click; end; ypos := ypos + _Button.Height + 5; end; end;
Delphi-Quellcode:
Mein Problem besteht nun darin, das die Objektliste sich zur Laufzeit verändern kann, d.h. neue Objekte hinzukommen oder gelöscht werden. Wie kann ich dann die Buttons entsprechend neu aufbauen.
procedure TMainForm.Selection_Buttons_Click(Sender: TObject);
var guid, name: string; _Activity: TActivity; pos: integer; begin if Sender is TButton then begin name:=TButton(Sender).Caption; guid:=Get_GuidStr_From_ComponentName(TButton(Sender).Name); pos:=self.fObjManager.ActivityList.IndexOf(guid); _Activity:=TActivity(self.fObjManager.ActivityList.Objects[pos]); self.fObjManager.CurrentActivity := _Activity; end; end; Gruß, Christoph |
Re: Komponenten freigeben - Invalid pointer operation
Zitat:
![]() |
Re: Komponenten freigeben - Invalid pointer operation
Ok, da würde ich eine andere herangehensweise vorschlagen. Zum einen widerstrebt es mir grundsätzlich irgendwelche Dinge in irgendwelchen Strings abzulegen um dann nachher wieder aus einem String wieder was zu ermitteln. In deinem Falle würde ich einfach folgendes machen:
1. Eine Klasse anlegen die nix weiter hat als 2 Öffentliche Member-Variablen: Einen TButton und eine TActivity. Diese sorgt nachher für die Zuordnung 2. Eine Objektliste welche die Instanzen dieser Klasse enthält 3. Eine Funktion die immer aufgerufen wird, wenn sich irgendwas bei der Liste ändert bzw. besser: geändert hat. Vorgehensweise: 1. Liste der Miniklasse aktualisieren - Wenn du in der Objectlist mit der Miniklasse keine Instanz für eine Activity Instanz hast, dann eine Miniklasseninstanz erzeugen, die Activity Instanz zuweisen und der Miniklasse hinzufügen - Wenn du in der Miniklassenliste eine Instanz einer Miniklasse hast, dessen Activity Instanz du nicht mehr in der Liste deiner Activities findest, dann den vermerkten Button freigeben und den Eintrag aus der Miniklassenliste löschen (was die Miniklasseninstanz gleich mit freigibt) Damit hättest du alle Änderungen von der Activityliste übernommen. Einfacher wäre das ganze, wenn du in der grossen Verwaltung direkt an den beiden möglichen Punkten ansetzen kannst: Also wenn eine Activity hinzugefügt bzw. gelöscht wird. Dann kannst du dir das durchlaufen der Miniklassenliste ersparen. Als letztes nun noch die Buttons aktualisieren. Durchlaufe die Miniklassenliste und erzeuge einen Button, wo die Instanz Nil ist. Ansonsten übernehme die Caption von der Activity (falls sie sich geändert hat) und positioniere die Buttons anhand der Position in der Miniklassenliste. Der Name der Buttons ist somit egal, da alles über die Instanzen geregelt wird. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:23 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