Hallo alle...
Ihr dürft mir das Wochenende retten...
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:
Fehler beim Lesen von foInlineEditorBase.Font.Name: Zugriffsverletzung bei Adresse 0049BD0D in Modul 'dSRG.exe'. Lesen von Adresse 00000008.
Callstack:
Zitat:
>> EAccessViolation, Zugriffsverletzung bei Adresse 0049BD0D in Modul 'dSRG.exe'. Lesen von Adresse 00000008
0049bd0d +0bd dSRG.exe SysUtils TEncoding.GetCharCount
0049be43 +0bb dSRG.exe SysUtils TEncoding.GetChars
0049c152 +02a dSRG.exe SysUtils TEncoding.GetString
0049c11c +018 dSRG.exe SysUtils TEncoding.GetString
004c23e4 +0b0 dSRG.exe Classes TReader.ReadString
004c244e +032 dSRG.exe Classes TReader.ReadWideString
004c1bb9 +1f9 dSRG.exe Classes TReader.ReadPropValue
004c174b +187 dSRG.exe Classes TReader.ReadProperty
004c1055 +015 dSRG.exe Classes TReader.ReadDataInner
004c1008 +038 dSRG.exe Classes TReader.ReadData
004c73f5 +001 dSRG.exe Classes TComponent.ReadState
00506c44 +02c dSRG.exe Controls TControl.ReadState
0050b215 +025 dSRG.exe Controls TWinControl.ReadState
0059d441 +06d dSRG.exe Forms TCustomForm.ReadState
004c1f77 +1d7 dSRG.exe Classes TReader.ReadRootComponent
004be65a +032 dSRG.exe Classes TStream.ReadComponent
004b94b7 +057 dSRG.exe Classes InternalReadComponentRes
004b9627 +05f dSRG.exe Classes InitComponent
004b95fc +034 dSRG.exe Classes InitComponent
004b96b5 +061 dSRG.exe Classes InitInheritedComponent
0059cca2 +0c6 dSRG.exe Forms TCustomForm.Create
00afbb32 +022 dSRG.exe FormInlineEditorProject 45 +1 TfoInlineEditorProject.Create
00afe079 +051 dSRG.exe FramePreferences 566 +3 TfrPreferences.ShowEditorProject
00afd754 +0cc dSRG.exe FramePreferences 339 +9 TfrPreferences.ProjectAdd
00afe9a7 +00f dSRG.exe FramePreferences 825 +1 TfrPreferences.actProjectNewExecute
WICHTIG:
Der Editor wird beim ersten Aufruf normal erzeugt und freigegeben. (Bild 2)
Erst beim (immer) 2. Aufruf kracht es im constructor beim inherited.
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:
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;
WAS ICH BEREITS GEMACHT HABE:
- 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...
Danke
LÖÖÖÖÖSUNG:
Um es mit Daniels Worten zu sagen... Es war wieder eine Verschwendung von wertvollen Bits und Bytes.
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...
Was ein Action...