Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   TScrollBox BUG???? (https://www.delphipraxis.net/179808-tscrollbox-bug.html)

sintronic86 3. Apr 2014 11:53

TScrollBox BUG????
 
Hallo an alle, ich schon wieder.

Ich habe ein Problem mit einer TScrollBox.

Folgendes Umfeld:
-Ich erstelle zur Laufzeit ein TPageControl
-darin zur Laufzeit TabSheets (Wobei ich TMyTabSheet verwende -> hat nur ein paar Eigenschaften mehr)
-darin erstelle ich die TScrollBox, welche (scheinbar) meine Probleme verursacht
-die ScrollBox wird mit eigenen Komponenten (Align:=alTop) befüllt, bis sie soweit befüllt ist, das die ScrollBar erscheint

-> Es gibt nun zwei Scenarien die auftreten können, wenn ich einzelne dieser Komponenten wieder löschen:

1. Ich lösche nur soviele Komponenten, dass die ScrollBar noch immer sichtbar ist
-> wenn ich nun neue Komponenten erstelle, funktioniert alles super. Sie werde wie erwartet an die bereits vorhanden angehängt (alTop)

2. Ich lösche soviele Komponenten, das der Clientbereich der Scrollbox nicht ganz ausgefüllt ist und somit die ScrollBar verschwindet
-> wenn ich nun neue Komponenten erstellen möchte, bekomme ich eine Exception:
"Im Projekt Test.exe ist eine Exception der Klasse $C0000005 mit der Meldung 'access violation at 0x004a1060: read of address 0x00000050' aufgetreten."

-> komischerweise tritt diese Exception innerhalb meiner Komponente auf:
-die Komponente hat eine private Eigenschaft (eBezeichnung: TEdit), welche im constructor erstellt wird


an folgender Stelle tritt die Exception (laut durchsteppen im Debugger) auf:
Delphi-Quellcode:
// BEZEICHNUNG ---------------------------------------------------------------
  eBezeichnung := TEdit.Create(Self);
  with eBezeichnung do begin
    Parent := Self; <--------------------------------------------------
    Left  := 50;
    Top   := (Self.Height div 2) - (Height div 2);
    Width := 450;

    Text  := FBezeichnung;

    OnChange    := MyComponentOnDataChange;
    OnEnter     := MyComponentOnEnter;
    OnMouseLeave := MyMouseLeave;
  end;

Ich kann es mir nicht erklären, dass das nur dann passiert, wenn die Scrollbar der ScrollBox nicht mehr sichtbar ist. Zufall???

Bummi 3. Apr 2014 12:21

AW: TScrollBox BUG????
 
Das böse With
Delphi-Quellcode:
with eBezeichnung do begin
    Parent := Self;
wer ist hier wohl Self ....

himitsu 3. Apr 2014 12:26

AW: TScrollBox BUG????
 
Self ist der versteckte Self-Parameter der Methode, wo dieser Code drin ist.

Solange niemand mal auf die Idee kommt, ein Feld/Property mit diesem namen anzulegen, gibt es da eigentlich keine Probleme.
(ist genauso, wie mit den anderen Parametern und lokalen Variablen)

sintronic86 3. Apr 2014 12:33

AW: TScrollBox BUG????
 
Oh, das ging aber schnell! :)

@Bummi
Diesen Ablauf verwende ich schon seit geraumer Zeit ohne Probleme. Zudem wird das Edit ja auch richtig zugewiesen und auf meiner Komponente angezeigt.

Ich bin immer noch am rumtesten und nun habe ich auch folgendes festgestellt (ich weiss nicht ob es hilfreich ist):
-Wenn ich meiner Komponent (dem Parent des eBezeichnung) keinen Parent zu weise, dann funkionieren alle Varianten die ich ausprobierte habe.

Bin immer noch absolut ratlos.

Perlsau 3. Apr 2014 12:47

AW: TScrollBox BUG????
 
Jetzt nimm doch einfach mal den Rat von Bummi an, entferne das With und kopiere vor alle entsprechenden Bezeichner die Zeichenfolge "eBezeichnung.". Danach wirst du mit Sicherheit selbst erkennen, wo der Fehler lag.

Man sollte With meiden wie der Teufel das Weihwasser, es birgt zu viele Fallstricke.

sintronic86 3. Apr 2014 12:52

AW: TScrollBox BUG????
 
@Perlsau

Selbstverständlich habe ich das auch ausprobiert, nachdem Bummi seine Antwort gegeben hat. Leider brachte das keine Besserung.

Wenn es hilft und jemand sowohl die Zeit als auch die Lust hat, würde ich auch das gesamte Projekt einmal posten.
Vielleicht könnt ihr das besser verstehen, wenn ihr es in der Gesamtheit vor der Nase habt!

sintronic86 3. Apr 2014 13:55

AW: TScrollBox BUG????
 
Ich habe den Fehler gefunden. Und ich könnte mich so ärgern, weil es eigentlich ein Anfängerfehler ist :wall::


Das OnCreate meiner Komponent sieht so aus (Kurzfassung):

Delphi-Quellcode:
constructor TTest.Create(...);
begin
  inherited Create(AOwner);

  Parent := ...
  Align := ...


  Edit1 := TEdit.Create
  with Edit1 do begin
    Parent := Self;
    ...
  end;

  Edit2 := TEdit.Create
  with Edit2 do begin
    Parent := Self;
    ...
  end;

  Edit3 := TEdit.Create
  with Edit3 do begin
    Parent := Self;
    ...
  end;

  ...
end;
Ich habe das OnPaint meiner Komponente überschrieben.
Innerhalb des OnPaint habe ich einen Zugriff auf alle beinhalteten Komponenten gemacht:

Delphi-Quellcode:
Edit1.Left := ...
Edit2.Left := ...
Edit3.Left := ...
Da das OnPaint durch das zuweisen
Delphi-Quellcode:
Edit1.Parent := Self
ausgelöst wird, gibt es einen Fehler beim Zugriff auf
Delphi-Quellcode:
Edit2.Left := ...
, welches zu diesem Zeitpunkt noch garnicht existiert.
Wenn ich dafür sorge, dass das OnPaint nicht ausgeführt wird, bevor das OnCreate der Komponente gelaufen ist, läuft alles reibungslos.


Ich danke euch trotzdem allen für eure Bemühungen!

BUG 3. Apr 2014 19:24

AW: TScrollBox BUG????
 
Du hast gerufen? Hier bin ich! :mrgreen:


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:50 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