AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Fehler dynamische Form Erzeugung

Ein Thema von haentschman · begonnen am 27. Feb 2016
Antwort Antwort
Benutzerbild von haentschman
haentschman

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.388 Beiträge
 
Delphi 12 Athens
 
#1

Fehler dynamische Form Erzeugung

  Alt 27. Feb 2016, 07:04
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...
Miniaturansicht angehängter Grafiken
database-normal.png   project-normal.png  

Geändert von haentschman (27. Feb 2016 um 08:58 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:51 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz