5 Stimmen

Delphi-Problem bei der gemeinsamen Nutzung von Bildlisten in Formularen

Ich habe die gemeinsame Nutzung von Bildlisten über mehrere Formulare in Delphi für Jahre jetzt. Ich habe eine TImageList auf dem Hauptformular meiner App und dann habe ich andere Formulare, die Komponenten haben, wo ich die Images-Eigenschaft auf die Bildliste aus dem Hauptformular (z. B. MyMainForm.MyImageList) zur Entwurfszeit festlegen.

Das Problem, das ich habe, ist, dass zufällig die Eigenschaft Bilder auf den Formularen gelöscht wird, die auf die Bilderliste im Hauptformular verweisen.

Dieses Problem scheint erst vor kurzem aufgetreten zu sein, aber ich konnte die genaue Ursache noch nicht ausfindig machen. Ich scheine keine Möglichkeit zu finden, das Problem beliebig zu reproduzieren; es scheint nur zufällig aufzutreten. Ich habe bemerkt, dass es genau dann passiert, wenn ein Formular geöffnet wird.

Eine Sache, die ich kürzlich in Delphi geändert habe, ist, dass ich die Funktion zum automatischen Speichern der Projektoberfläche und der Symbole aktiviert habe. Wenn ich nun das Projekt öffne, wird immer gespeichert, welche Formulare geöffnet waren. Da dieses Problem beim Öffnen eines Formulars auftritt und nun alle Formulare neu geöffnet werden, die beim letzten Öffnen des Projekts geöffnet waren, tritt es häufiger auf.

Wir haben einige Entwickler, die an diesem Projekt arbeiten, und wir verwenden SVN für die Versionskontrolle. Ein Problem, das durch die Aktivierung der Funktion "Autosave Project desktop and symbols" entstanden ist, besteht darin, dass bei einem SNV-Update des Projekts die Symboldatei ungültig werden kann (weil wir die Symboldatei nicht unter Versionskontrolle haben). Dies führt nur zu einer Fehlermeldung von Delphi, aber ansonsten scheint es harmlos zu sein. Wir kompilieren das Projekt einfach neu und die Symboldatei wird korrigiert.

Übrigens, ich verwende Delphi 7.

Wenn Sie Fragen haben oder Klarstellungen wünschen, hinterlassen Sie einen Kommentar, und ich werde die Frage aktualisieren.

0 Stimmen

Verwandte Delphi-Fehler hier: stackoverflow.com/questions/2416127/ Ich habe beide am selben Tag erhalten (als die eine erschien, erschien auch die andere).

9voto

Jan Goyvaerts Punkte 20683

Vor vielen Jahren hatte ich das gleiche Problem. Seitdem habe ich die Angewohnheit, Bildlisten, die von mehreren Formularen gemeinsam genutzt werden, in ein TDataModule zu packen. Dann verliert Delphi die Verknüpfung nicht. Wenn Sie nicht-visuelle Komponenten in Datenmodule einbinden, verringert sich auch das Durcheinander in Ihren Formularen während der Entwurfszeit. Zur Laufzeit wird das TDataModule vor dem Hauptformular instanziiert.

7voto

moobaa Punkte 4484

Wenn ich auf diese Art von Verhalten gestoßen bin, lag es immer daran, dass ich das "andere" Formular geöffnet hatte, ohne dass das Hauptformular in der IDE geöffnet war... die IDE hat versucht, den Verweis MyMainForm.MyImageList aufzulösen, ist dabei gescheitert und hat den Verweis entfernt.

Wir umgingen dies, indem wir die Bildliste manuell im Code zuwiesen (normalerweise in AfterConstruction).

1 Stimmen

Das Problem wird also gelöst, wenn ich die Eigenschaft Images in der AfterConstruction-Methode des Formulars festlege, aber wenn ich es auf diese Weise mache, kann ich die Bilder zur Entwurfszeit nicht sehen (z. B. auf einer Symbolleiste, die auf die Bilderliste verweist). Gibt es eine Lösung für dieses Problem?

0 Stimmen

Nun, Sie können sie zur Entwurfszeit festlegen (natürlich nur, wenn MyMainForm geöffnet ist) und ganz normal entwerfen; die AfterConstruction sorgt nur dafür, dass die Eigenschaft festgelegt bleibt. Eine Absicherung, wenn Sie so wollen.

4voto

moobaa Punkte 4484

Ah - und die Funktion "AutoSave Project desktop" öffnet manchmal Dateien (und damit Formulare) in "umgekehrter" Reihenfolge - was die IDE-doesn't-know-about-MyMainForm "Funktion" noch verschlimmert.

0 Stimmen

Ja, wenn Sie meine Antwort lesen, werden Sie sehen, dass ich dieses Problem durch die Deaktivierung von AutoSave umgehen konnte. Was seltsam ist, ist, dass auch w/AutoSave deaktiviert, kann ich immer noch das Problem in meinem Hauptprojekt zu reproduzieren, aber nicht in einem brandneuen Projekt (siehe meine Antwort für mehr).

3voto

Serguzest Punkte 1277

Ich habe sozusagen gemeinsame Dinge in Datamodule statt in Formulare gesteckt. Versuchen Sie es auf diese Weise.

2voto

Liron Yahdav Punkte 9172

Ich habe eine Reihe von Experimenten durchgeführt und dabei einige wirklich merkwürdige Ergebnisse erzielt. Aber ich habe einige Änderungen vorgenommen, damit ich an meinem Projekt arbeiten kann, ohne dass dieses Problem auftritt. Ich musste die AutoSave-Funktion deaktivieren (dies verhindert, dass sekundäre Formulare, die auf das Hauptformular verweisen, vor dem Hauptformular geöffnet werden). Dann musste ich sicherstellen, dass ich die .dsk-Datei des Projekts lösche (die AutoSave-Datei des Projekt-Desktops). Wenn ich nun das Projekt öffne, wird immer das Hauptformular geöffnet, so dass das Problem der gelöschten Verweise auf das Hauptformular nicht mehr auftritt. Das Problem tritt jedoch immer noch auf, wenn ich nach dem Öffnen des Projekts das Hauptformular schließe und dann ein Formular öffne, das auf das Hauptformular verweist.

Auch ich war nicht in der Lage, dieses Problem der Verweise auf ein anderes Formular immer in einem brandneuen Projekt mit der AutoSave-Funktion deaktiviert zu reproduzieren, obwohl ich es w / AutoSave deaktiviert in meinem aktuellen Projekt reproduzieren kann. Ich habe keine Ahnung, warum, aber ich glaube nicht, dass es sich lohnt, dies weiter zu untersuchen.

Nachfolgend finden Sie die Daten zu einigen meiner Experimente, die ich mit meinem bestehenden Projekt durchgeführt habe. WORKS bedeutet, dass der Verweis auf das Hauptformular in Ordnung ist. BUG bedeutet, dass der Verweis auf das Hauptformular gelöscht wurde. Dies geschah mit aktiviertem AutoSave und dem manuellen Schließen aller Formulare, bevor ich das Projekt schloss.


  1. Offenes Projekt
  2. Hauptformular öffnen
  3. Sekundäres Formular öffnen
  4. Ergebnis: WORKS

  1. Offenes Projekt
  2. Sekundäres Formular öffnen
  3. Ergebnis: BUG

  1. Offenes Projekt
  2. Hauptformular öffnen
  3. Hauptformular schließen
  4. Sekundärseite öffnen von
  5. Ergebnis: BUG

  1. Offenes Projekt
  2. Sekundäres Formular öffnen
  3. Ergebnis: BUG
  4. Bilder-Eigenschaft der Komponente im sekundären Formular auf die Bilderliste im Hauptformular setzen
  5. Sekundärform schließen
  6. Sekundäres Formular öffnen
  7. Ergebnis: WORKS ("caches"-Referenz nur für das sekundäre Formular; siehe unten für die Erklärung von "caches")

  1. Offenes Projekt
  2. Magisches Formular öffnen (siehe unten für die Erklärung eines "magischen" Formulars)
  3. Ergebnis: WORKS ("caches" jeden Verweis auf das Hauptformular für alle Formulare; siehe unten für die Erklärung von "caches")

Weitere interessante Ergebnisse:

  • Wenn Sie das Formular öffnen und die Bildliste nicht angezeigt wird, wird die .dfm geändert, aber Delphi sagt nicht, dass die Datei geändert wurde (z.B. wenn Sie das Formular schließen, werden Sie nicht über ungespeicherte Änderungen gewarnt). Erst wenn Sie das Formular speichern, wird die dfm den Verweis auf die imagelist löschen.
  • Ich habe festgestellt, dass es in meinem Projekt einige "magische" Formulare gibt (in Ermangelung eines besseren Begriffs). Magische Formulare verweisen in ihrer .dfm-Datei auf das Hauptformular meines Projekts und verlieren ihre Verweise auf das Hauptformular nicht, nachdem sie geöffnet wurden, selbst wenn sie vor einem anderen Formular geöffnet werden.
  • Diese magischen Formulare bewirken die Zwischenspeicherung aller Bildlistenverweise aus dem Hauptformular. Wenn Sie eines dieser Formulare öffnen, können Sie jedes Formular öffnen, das auf das Hauptformular verweist, und die Verweise gehen während dieser Projektsitzung nicht verloren (selbst wenn das magische Formular dann geschlossen wird).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X