AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Seltsames Werteverhalten

Ein Thema von Delbor · begonnen am 29. Jan 2019 · letzter Beitrag vom 2. Feb 2019
Antwort Antwort
Delbor

Registriert seit: 8. Okt 2006
Ort: St.Gallen/Schweiz
761 Beiträge
 
Delphi 10.3 Rio
 
#1

Seltsames Werteverhalten

  Alt 29. Jan 2019, 12:52
Delphi-Version: 5
Hi zusammen

Da sich dieser Thread vom ursprünglichen Thema entfernt hat, beginne ich hier einen Neuen.
Corpus Delicti ist dies:
aktuelleansicht.jpg
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
Roger
Man muss und kann nicht alles wissen - man muss nur wissen, wo es steht.
Frei nach Albert Einstein
http://roase.ch
  Mit Zitat antworten Zitat
Dennis07

Registriert seit: 19. Sep 2011
Ort: Deutschland
340 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#2

AW: Seltsames Werteverhalten

  Alt 1. Feb 2019, 23:32
Also als aller erstes: 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"?
Dennis
  Mit Zitat antworten Zitat
Delbor

Registriert seit: 8. Okt 2006
Ort: St.Gallen/Schweiz
761 Beiträge
 
Delphi 10.3 Rio
 
#3

AW: Seltsames Werteverhalten

  Alt 2. Feb 2019, 10:44
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:
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:
ScBX := ScBxRadioButtons.ClientWidth div 2; ScBx ist somit die Mitte der Scrollbox.
Left berechne ich dann in der Schleife:
LLeft := ScBX - (FRadioButtonList.Items[i].Width div 2); Aber - und das ist wahrscheinlich das Wesentliche - der erste Topwert berechnet sich so:
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
Roger
Man muss und kann nicht alles wissen - man muss nur wissen, wo es steht.
Frei nach Albert Einstein
http://roase.ch

Geändert von Delbor ( 2. Feb 2019 um 10:49 Uhr)
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:10 Uhr.
Powered by vBulletin® Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2019 by Daniel R. Wolf