Autor Beitrag
galagher
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2510
Erhaltene Danke: 44

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: 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. :eyecrazy:

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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2510
Erhaltene Danke: 44

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Mo 18.09.17 19:14 
user profile icongalagher hat folgendes geschrieben Zum zitierten Posting springen:
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:
ausblenden volle Höhe Delphi-Quelltext
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 376
Erhaltene Danke: 32

Windows 8.1
Delphi 10.4 Comm. Edition
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2510
Erhaltene Danke: 44

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Mo 18.09.17 20:58 
user profile iconGuaAck hat folgendes geschrieben Zum zitierten Posting springen:
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:
user profile icongalagher hat folgendes geschrieben Zum zitierten Posting springen:
dass mit dieser Komponente etwas nicht stimmt.
Das ist korrekt!

ausblenden 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
//Der folgende auskommentierte Code hat hier nichts verloren, der gehört in eine Prozedur SetImageList,
//und korrekterweise muss es dort dann FImageList lauten:
(*
  if Assigned(ImageList) then
  begin
    if ItemHeight <> ImageList.Height then ItemHeight := ImageList.Height;
    while Items.Count < ImageList.Count do Items.Add('');
  end;
*)


//Weiters fehlt hier "inherited", also schreibe ich es eben hin:
inherited;

//Der Rest ist ok!

//...

end;
[delphi]

_________________
gedunstig war's - und fahle wornen zerschellten karsig im gestrock. oh graus, es gloomt der jabberwock - und die graisligen gulpen nurmen!
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2510
Erhaltene Danke: 44

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Di 19.09.17 08:32 
Der Fehler war eindeutig die Zeile
ausblenden 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



BeitragVerfasst: Di 19.09.17 12:58 
- Nachträglich durch die Entwickler-Ecke gelöscht -

Für diesen Beitrag haben gedankt: galagher
galagher Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2510
Erhaltene Danke: 44

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Di 19.09.17 17:49 
user profile iconFrühlingsrolle hat folgendes geschrieben Zum zitierten Posting springen:
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Mi 20.09.17 06:42 
user profile icongalagher hat folgendes geschrieben Zum zitierten Posting springen:
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 285
Erhaltene Danke: 33


DX10 Berlin Professional
BeitragVerfasst: Mi 20.09.17 13:23 
Moin... 8)
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2510
Erhaltene Danke: 44

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Mi 20.09.17 18:58 
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
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.

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19272
Erhaltene Danke: 1740

W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 21.09.17 06:02 
user profile icongalagher hat folgendes geschrieben Zum zitierten Posting springen:
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
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!
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.

Dass du die richtige Stelle gefunden hast, wollte ich damit nicht bezweifeln.
galagher Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 2510
Erhaltene Danke: 44

Windows 10 Home
Delphi 10.1 Starter, Lazarus 2.0.6
BeitragVerfasst: Do 21.09.17 21:10 
user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
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!