Autor |
Beitrag |
galagher
      
Beiträge: 2556
Erhaltene Danke: 45
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: Mo 18.09.17 18:46
Hallo!
Wenn ich das Projekt mit Delphi XE2 kompilieren, gibt es keine Probleme, die .exe-Datei läuft.
Wenn ich es mit Delphi 10.1 kompiliere, gibt es zunächst auch keine Probleme, die .exe-Datei läuft, solange sie in einem Ordner ist, in dem ich mit meinem eingeschränkten Benutzerkonto Schreibrechte habe. Wenn die Datei in einem Ordner in C:\Program Files (x86) ist, kommt manchmal direkt nach dem Start folgende Meldung:
Zitat: | Zugriffsverletzung bei Adresse 75484355 in Modul 'comctl32.dll'. Lesen von Adresse 00000055. |
Beim Klicken auf meine Komponente TImageCombo zur Laufzeit kommt diese Meldung ebenfalls. Also liegt es auf der Hand, dass mit dieser Komponente etwas nicht stimmt. Also habe ich ein neues Projekt erstellt, das diese Komponente ebenfalls mit gleichen Einstellungen enthält, und siehe da: Das Programm läuft anstandslos auch im Program Files (x86)-Ordner.
Wenn ich die Komponente aus dem eigentlichen Projekt entferne, läuft es aber ebenfalls problemlos.
Was hat das zu bedeuten?
_________________ gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
|
|
galagher 
      
Beiträge: 2556
Erhaltene Danke: 45
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: Mo 18.09.17 19:14
galagher hat folgendes geschrieben : | dass mit dieser Komponente etwas nicht stimmt. |
Zur Erklärung: Meine Komponente bezieht ihre Images aus einer TImageList.
Ist dieser Code korrekt? Denn wenn ich ihn auskommentiere, habe ich klarerweiese keine Images mehr in der ComboBox, aber auch keine Fehlermeldung:
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32:
| procedure TImageCombo.DrawItem(Index: Integer; Rect: TRect; State: TOwnerDrawState); var OutText: String; begin if Assigned(ImageList) then begin if ItemHeight <> ImageList.Height then ItemHeight := ImageList.Height; while Items.Count < ImageList.Count do Items.Add(''); end;
OutText := Items.Strings[Index];
with Canvas do begin FillRect(Rect);
if (FDrawBitmap) and Assigned(ImageList) then begin ImageList.Draw(Canvas, Rect.Left+2, Rect.Top, Index, True); Rect.Left := Rect.Left + ImageList.Width + 4; Rect.Bottom := Rect.Top + ImageList.Height + 14; Rect.Top := Rect.Top+FItemTop; end else begin FillRect(Rect); Rect.Left := 3; end;
DrawText(Handle, PChar(OutText), Length(OutText), Rect, dt_WordBreak); end; end; |
_________________ gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
Zuletzt bearbeitet von galagher am Mo 18.09.17 21:02, insgesamt 1-mal bearbeitet
|
|
GuaAck
      
Beiträge: 378
Erhaltene Danke: 32
Windows 8.1
Delphi 10.4 Comm. Edition
|
Verfasst: Mo 18.09.17 20:17
Hallo
galagher,
hast Du es schon mal mit dem Debugger versucht, z. B. Breakpoint auf Zeile 5 in Deinem Code und dann mit Einzelschritten ausführen?
Oft treten solche Fehler auf, wenn z. B. ein OnChange-Event (das man übersehen hat) ausgelöst wird, aber noch nicht alle Resourcen für die entsprechende Behandlungsroutine verfügbar sind.
Gruß
GuaAck
|
|
galagher 
      
Beiträge: 2556
Erhaltene Danke: 45
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: Mo 18.09.17 20:58
GuaAck hat folgendes geschrieben : | hast Du es schon mal mit dem Debugger versucht, z. B. Breakpoint auf Zeile 5 in Deinem Code und dann mit Einzelschritten ausführen? |
Aus Delphi heraus funktioniert es ja immer, ebenso aus einem Ordner, in dem ich Schreibrechte habe!
Aber ich denke, ich habe den Fehler: galagher hat folgendes geschrieben : | dass mit dieser Komponente etwas nicht stimmt. |
Das ist korrekt!
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22:
| procedure TImageCombo.DrawItem(Index: Integer; Rect: TRect; State: TOwnerDrawState); var OutText: String; begin
inherited;
end; | [delphi]
_________________ gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
|
|
jaenicke
      
Beiträge: 19312
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Di 19.09.17 04:05
Ein Tipp für solche Fälle:
Du kannst das Programm auch mit externen Debugsymbolen kompilieren und ein ShowMessage ins FormCreate oder den Projektquelltext .dpr nach dem begin setzen. Dann startest du das Programm so wie du es tust, wenn es das Problem gibt, lässt die MessageBox stehen und verbindest dich mit Delphi zu dem laufenden Prozess. Dann bestätigst du die MessageBox und bekommst vermutlich den Fehler auch im Debugger angezeigt.
Für diesen Beitrag haben gedankt: galagher
|
|
galagher 
      
Beiträge: 2556
Erhaltene Danke: 45
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: Di 19.09.17 08:32
Der Fehler war eindeutig die Zeile
Delphi-Quelltext 1:
| if ItemHeight <> ImageList.Height then ItemHeight := ImageList.Height; | in Prozedur TImageCombo.DrawItem, denn immer, wenn ich diese auskommentiert habe, gab's kein Problem.
Obwohl das Problem jetzt gelöst ist, stelle ich mir die Frage, warum es beim Ausführen im Ordner Program File (x86) öfter, aber nicht immer, zu der Fehlermeldung kam, beim Ausführen in anderen Ordnern niemals, und warum das nur bei Delphi 10.1-Kompilaten so war, bei Delphi XE2-Kompilaten nie! Ist doch seltsam, oder?
_________________ gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
|
|
Frühlingsrolle
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Di 19.09.17 12:58
- Nachträglich durch die Entwickler-Ecke gelöscht -
Für diesen Beitrag haben gedankt: galagher
|
|
galagher 
      
Beiträge: 2556
Erhaltene Danke: 45
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: Di 19.09.17 17:49
Frühlingsrolle hat folgendes geschrieben : | Setz' inherited mal ganz am Anfang, und nicht irgendwo mittendrin. |
Habe ich schon gestern gemacht, und FImageList.Height wird jetzt in einer eigenen Prozedur eingestellt, beim Zuweisen einer TImageList. Jetzt funktioniert es anstandslos!
_________________ gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
|
|
jaenicke
      
Beiträge: 19312
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mi 20.09.17 06:42
galagher hat folgendes geschrieben : | Obwohl das Problem jetzt gelöst ist, stelle ich mir die Frage, warum es beim Ausführen im Ordner Program File (x86) öfter, aber nicht immer, zu der Fehlermeldung kam, beim Ausführen in anderen Ordnern niemals, und warum das nur bei Delphi 10.1-Kompilaten so war, bei Delphi XE2-Kompilaten nie! Ist doch seltsam, oder? |
Weil es schlicht "Zufall" ist, wenn etwas im Speicher nicht stimmt. Da steht dann an einer Speicherstelle eben mal das eine und mal das andere und je nachdem knallt es dann. Da reicht es schon eine Variable hinzuzufügen oder eben ein anderes Verzeichnis zu nehmen und schon ist etwas anders.
Mit dem konkreten Problem hat die Änderung nichts zu tun.
|
|
haentschman
      
Beiträge: 285
Erhaltene Danke: 33
DX10 Berlin Professional
|
Verfasst: Mi 20.09.17 13:23
Moin...
Könnte das WITH querschießen?
Es weiß inzwischen jeder:
Zitat: | Conclusion: There really is no safe usuage of with. |
stackoverflow.com/qu...statements-in-delphi
|
|
jaenicke
      
Beiträge: 19312
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mi 20.09.17 14:41
Möglich ist bei with alles, aber sehen tue ich so erst einmal keinen Konflikt. (Aber dass man das nicht so schnell sieht, ist ja genau das Tückische daran.)
|
|
galagher 
      
Beiträge: 2556
Erhaltene Danke: 45
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: Mi 20.09.17 18:58
jaenicke hat folgendes geschrieben : | Mit dem konkreten Problem hat die Änderung nichts zu tun. |
Nach der Änderung ist der Fehler aber definitiv weg, und du wirst mir zustimmen, dass der Code in der DrawItem-Prozedur fehl am Platz war! Ich wusste es vor ca. 10 Jahren, als ich die Komponente entwickelt habe, nicht besser.
Der Fehler trat, wenn er denn auftrat, immer unmittelbar nach dem Programmstart auf, und, das habe ich nicht geschrieben, dann konnte ich die ComboBox nicht benutzen: Sie klappte zwar auf und zeigte die Images an, aber beim "Drübergehen" mit der Maus klappte sie mit besagter Fehlermeldung wieder zu.
jaenicke hat folgendes geschrieben : | Möglich ist bei with alles, aber sehen tue ich so erst einmal keinen Konflikt. (Aber dass man das nicht so schnell sieht, ist ja genau das Tückische daran.) |
Das with ist immer noch drin!
Also für mich steht fest: Der Code war dort deplatziert, verursachte dort den Fehler und gehört in eine eigene Prozedur, und zwar in jene, die die ImageList zuweist. Er muss ja auch nur 1x ausgeführt werden, und nicht jedesmal beim Zeichnen.
Delphi XE2 erzeugt wohl Code, der das toleriert, Delphi 10.1 nicht. Vielleicht irre ich mich ja, aber es sieht so aus!
_________________ gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
|
|
jaenicke
      
Beiträge: 19312
Erhaltene Danke: 1747
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Do 21.09.17 06:02
|
|
galagher 
      
Beiträge: 2556
Erhaltene Danke: 45
Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
|
Verfasst: Do 21.09.17 21:10
jaenicke hat folgendes geschrieben : | So meinte ich das nicht. Ich meinte das bezogen auf den Absatz vorher und allgemein. Wenn Speicher nicht den gewünschten Inhalt hat, kann eine Änderung an anderer Stelle dazu führen, dass der Fehler auftritt oder verschwindet. Eben zum Beispiel durch Änderung des Verzeichnisses oder des Compilers. |
Ja, das kann ich mir vorstellen!
_________________ gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
|
|
|