Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Seltsames Werteverhalten (https://www.delphipraxis.net/199522-seltsames-werteverhalten.html)

Delbor 29. Jan 2019 13:52

Delphi-Version: 5

Seltsames Werteverhalten
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hi zusammen

Da sich dieser Thread vom ursprünglichen Thema entfernt hat, beginne ich hier einen Neuen.
Corpus Delicti ist dies:
Anhang 50631
Vorerst aber zu dem, was sich seit dem oben verlinkten Thread geändert hat.
Nach wie vor im RadiobuttonFrame:
Delphi-Quellcode:
procedure TRadioButtonsFrame.RadioButtonPosition2;
  var i, x, y, ScBX, LHeight, LLeft: Integer;
begin
  inc(FResizeCounter);
  x := FRadioButtonList.Count -1;
  Self.FReportList.Add('procedure TRadioButtonsFrame.RadioButtonPosition2 - ' + inttostr(FResizeCounter));
  For i := 0 to x do
  begin
    FRadioButtonList.Items[i].Width := 50;

    LLeft := (ScBxRadioButtons.ClientWidth div 2) - (FRadioButtonList.Items[i].Width div 2);
    LHeight := (i * FRadioButtonList.Items[i].Height) + ScBxRadioButtons.ClientHeight div 4;
    ScBX := ScBxRadioButtons.ClientWidth div 2;  //<=
    Self.FReportList.Add('ScBxRadioButtons.ClientWidth div 2 := ' + IntToStr(ScBX));

    Self.FReportList.Add('LLeft := ' + IntToStr(LLeft));
    Self.FReportList.Add('LHeight := ' + IntToStr(LHeight));

    FRadioButtonList.Items[i].Left := LLeft;
    FRadioButtonList.Items[i].Top := LHeight;
  end;
end;
Als einziges ist hier die grün markierte Zeile hinzugekommen. Ausserdem wird die Routine nicht mehr aus dem OnResize des Frames, sondern as dem OnCreate der Mainform aufgerufen:
Delphi-Quellcode:
procedure THomeOfficerMainForm.FormCreate(Sender: TObject);
begin
  FReportList := TStringlist.Create();
  Self.RadioButtonsFrame1.RadioButtonPosition2;
  Self.PdfScanFrame1.RadioButtonsFrame1.RadioButtonPosition2;
end;
Beim Beenden der Form lese ich die Reportliste des Frames aus:
Delphi-Quellcode:
procedure THomeOfficerMainForm.WriteReportFile;
  var S, DateTimeStr, DS: string;
      ReportStream: TFileStream;
begin
  DS := DateTimeToStr(Now);
  DateTimeStr := StringReplace(DS, ':', '-', [rfReplaceAll]);
  S := ExtractFilePath(Application.ExeName) + '\' + 'CodeReport ' +DateTimeStr+'.txt';
  try
    Reportstream := TFileStream.Create(S, fmOpenReadWrite);
  except
    Reportstream := TFileStream.Create(S, fmCreate);
  end;
  try
    FReportList.insert(0,DateTimeToStr(Now));
    FReportlist.Insert(1,'----------------');
    FReportList.AddStrings(Self.RadioButtonsFrame1.ReportList);
    FReportList.AddStrings(Self.PdfScanFrame1.RadioButtonsFrame1.ReportList);
    FReportlist.SaveToStream(ReportStream);
  finally
    Reportstream.Free;
  end;
end;
Und diese Liste:
Delphi-Quellcode:
29.01.2019 13:17:49
----------------
procedure TRadioButtonsFrame.RadioButtonPosition2 - 1
ScBxRadioButtons.ClientWidth div 2 := 396  //<==
LLeft := 371
LHeight := 55
ScBxRadioButtons.ClientWidth div 2 := 396  //<==
LLeft := 371
LHeight := 74
ScBxRadioButtons.ClientWidth div 2 := 396  //<==
LLeft := 371
LHeight := 97
ScBxRadioButtons.ClientWidth div 2 := 396  //<==
LLeft := 371
LHeight := 118

procedure TRadioButtonsFrame.RadioButtonPosition2 - 1
ScBxRadioButtons.ClientWidth div 2 := 43  //<==
LLeft := 18
LHeight := 32
ScBxRadioButtons.ClientWidth div 2 := 43 //<==
LLeft := 18
LHeight := 51
ScBxRadioButtons.ClientWidth div 2 := 51  //<====
LLeft := 26
LHeight := 74
ScBxRadioButtons.ClientWidth div 2 := 51  //<==
LLeft := 26
LHeight := 95
Wie man sieht, ändert sich nach dem 2. Prozedurkopf der Wert von ScBxRadioButtons.ClientWidth div 2 (ScBx := Scrollbox). Wie kann so etwas geschehen?

Gruss
Delbor

Dennis07 2. Feb 2019 00:32

AW: Seltsames Werteverhalten
 
Also als aller erstes:
Delphi-Quellcode:
Self
brauchst du nur bei expliziten Referenzen auf die Instanz (bzw. den Klassentypen bei nichtstatischen Klassenmethoden). In dem Fall (siehe OnCreate-Methode) ist das unnötig und macht den Code auch nicht gerade leichter zu lesen.
Und dann zu was generellem: Versuch mal bitte für die Zukunft, nicht einfach deinen gesamten Programmcode hier hinzupasten und dann zu fragen was damit nicht stimmt. Das schreckt echt ab und sorgt, wie du sicher festgestellt hast, nicht gerade dafür, dass sich viele Leute freiwillig mit deinem Problem beschäftigen. Lösche irelevanten Code weitestgehend, sodass jeder innerhalb weniger Sekunden verstanden hat, was für ein Problem du hast.

So, jetzt zum Problem: Was ist "ScBxRadioButtons" und was ist "TRadioButtonsFrame"?

Delbor 2. Feb 2019 11:44

AW: Seltsames Werteverhalten
 
Hi Dennis07

Zitat:

"ScBxRadioButtons" und was ist "TRadioButtonsFrame"?
ScBxRadioButtons ist eine Scrollbox, die auf dem TRadioButtonsFrame - einem TFrame - liegt und die die einzelnen Radiobuttons enthält. Klar, eine Radiogroup wäre einfacher, aber nach meinem Empfinden optisch nicht so das Gelbe vom Ei.

Ich wollte aufzeigen, wie die Radiobuttons entstehen - beide Radiobutton-Guppen entstehen aus dem selben Code in der Prozedure TRadioButtonsFrame.RadioButtonPosition2.
Auf der Form habe ich 2 Frameinstanzen, die diese Prozedur geerbt haben und die nun aus dem MainformCreate heraus aufgerufen werden.
Die beiden Instanzen unterscheiden sich deutlich in der Grösse, was aus der Reportliste ganz am Schluss des Beitrags ersichtlich ist.
Diese Liste verrät aber auch, dass sich die Leftwerte im kleineren Container ab dem dritten Element ändern.

Beim Durchlesen sehe ich: etwas verwirrend dürfte die lokale Variable LHeight sein - die definiert nicht die Höhe des i-ten Elements, sondern dessen Top, der sich aus der Höhe der vorangegangenen Elemente ergibt.

Unglücklich ist auch dies:
Delphi-Quellcode:
LHeight := (i * FRadioButtonList.Items[i].Height) + ScBxRadioButtons.ClientHeight div 4;
Auch hier wird nicht die Höhe, sondern der Top der Elemente festgelegt (Beim erste Durchlauf 0 x die Höhe).

Inzwischen umgehe(?) ich das Problem, indem ich noch vor Eintritt in die Schleife einen Wert festlege:
Delphi-Quellcode:
ScBX := ScBxRadioButtons.ClientWidth div 2;
ScBx ist somit die Mitte der Scrollbox.
Left berechne ich dann in der Schleife:
Delphi-Quellcode:
LLeft := ScBX - (FRadioButtonList.Items[i].Width div 2);
Aber - und das ist wahrscheinlich das Wesentliche - der erste Topwert berechnet sich so:
Delphi-Quellcode:
LHeight := (i * FRadioButtonList.Items[i].Height) + ScBxRadioButtons.ClientHeight div 6;
Damit werden alle 4 Radiobuttons höher platziert. Und das bringt mich auf die Idee, dass die Scrollbox nach dem 2. Element eine vertikale Scrollbar eingeblendet und so den Clientwith verändert hat.


Gruss
Delbor


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