![]() |
Fehler dynamische Form Erzeugung
Liste der Anhänge anzeigen (Anzahl: 2)
Hallo alle... :P
Ihr dürft mir das Wochenende retten... :thumb: Nachdem ich schon Tage ohne Erfolg nach der Ursache forsche, habt ihr vieleicht noch Ideen. GEGEBEN: Ich benutze in meinen Anwendungen sogenannte Inline Editoren. Das sind simple Forms ohne Rahmen die auf die Parent Listview positioniert werden. So funktioniert das bisher zig Mal ohne Probleme. Auch in der betroffenen Anwendung sind insgesamt 3 im Einsatz. Einer davon will nicht. :? AUFBAU: Die Editor Forms sind allesamt von einer Basisform abgeleitet. Der Editor wird erzeugt wenn er gebraucht wird und gleich wieder freigegeben. Normal: siehe Bild 1 PROBLEM: Der Editor für die Projekte schmiert mit Fehler ab: Zitat:
Zitat:
Der Editor wird beim ersten Aufruf normal erzeugt und freigegeben. (Bild 2) Erst beim (immer) 2. Aufruf kracht es im constructor beim inherited. :evil: HINWEIS: Alle Forms, außer der Mainform, werden im Projekt nicht automatisch erzeugt. CODE DES AUFRUFES: (Bei allen Verwendungen, bis auf kleine Anpassungen identisch)
Delphi-Quellcode:
WAS ICH BEREITS GEMACHT HABE:
procedure TfrPreferences.ShowEditorProject(Item: TListItem);
var Project: TdSRG_Project; Editor: TfoInlineEditorProject; CanExit: Boolean; CurrentItemIndex: Integer; begin CurrentItemIndex:= TdTools.GetSelectedIndex(lvProject, FPreferences.CommonSRG.ProjectList.Count); // LV Index merken Project:= TdSRG_Project(Item.Data); // Projekt aus den LV Item Editor:= TfoInlineEditorProject.Create(Project, lvProject); // Editor erzeugen -> hier krachts beim 2.Mal try TdTools.SetEditorPositions(lvProject, Editor); // setzt Position und Größe des Editors repeat Editor.ShowModal; // zeigt an CanExit:= FPreferences.IsProjectChangedValid(Editor.ProjectChanged, Project); // Prüfung until CanExit or Editor.IsCanceled; if not Editor.IsCanceled then begin Project.ProjectName:= Editor.ProjectChanged.ProjectName; // Datenübernahme Item.Data:= Project; case Project.State of ddsNewModified: begin Project.State:= ddsNew; end; else begin if Project.State <> ddsNew then begin Project.State:= ddsModified; end; end; end; RefreshItemProject(Item); SetButtonsProject(CurrentItemIndex); SetPreferencesChanged; end else begin case Project.State of ddsNew: begin FPreferences.CommonSRG.ProjectList.Remove(Project); lvProject.DeleteSelected; end; ddsNewModified: begin Project.State:= ddsNew; end; end; end; finally lvProject.SetFocus; Editor.Free; end; end; - Editor komplett neu aufgebaut über die Vererbung der IDE (Vererbbare Elemente) - Basisform komplett neu aufgebaut - Code des Aufrufes bis auf Erzeugen und Freigeben reduziert -> peng Alles in Allem weiß ich nicht mehr weiter und hoffe auf Ideen... :wink: Danke LÖÖÖÖÖSUNG: :thumb: Um es mit Daniels Worten zu sagen... Es war wieder eine Verschwendung von wertvollen Bits und Bytes. :stupid: Der Fehler kam aus einer ganz anderen Ecke. Ich habe in meinen Tools eine Funktion, via Marshal und Unmarshal, die mir ein Objekt in eine neue Instanz kopiert. Diese Funktion hat auch das Projekt Objekt ohne Murren kopiert. Im Ziel kam auch eine neue ausgefüllte Instanz an. Nur leider mag das Marshal und Unmarshal keine TSringlist. Mit generischen Listen im Objekt ist das kein Problem. Die Instanz der Stringlist im Datenobjekt war der Übeltäter. Was auch immer da zerschossen wird. Die Stringlist entfernt und die Form wird wie gewohnt angezeigt... :cheer: Was ein Action... :roll: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:40 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