AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Konstantenausdruck erwartet

Ein Thema von Delbor · begonnen am 26. Jan 2019 · letzter Beitrag vom 28. Jan 2019
Antwort Antwort
Delbor

Registriert seit: 8. Okt 2006
Ort: St.Gallen/Schweiz
1.192 Beiträge
 
Delphi 11 Alexandria
 
#1

Konstantenausdruck erwartet

  Alt 26. Jan 2019, 11:33
Delphi-Version: 10.2 Tokyo
Hi zusammen
Folgende Prozedure löst den Fehler aus:
Delphi-Quellcode:
procedure TRadioButtonsFrame.RadioButtonPosition;
  var i, x, y: Integer;
begin
  x := FRadioButtonList.Count -1;
  For i := 0 to FRadioButtonList.Count -1 do
  begin
    Case i of
    0: begin
          FRadioButtonList.Items[i].Left := 12;
          FRadioButtonList.Items[i].Top := 12;
          FRadioButtonList.Items[i].AlignWithMargins := true;
          FRadioButtonList.Items[i].Margins.Top := 5;
          FRadioButtonList.Items[i].Margins.Bottom := 5;
          FRadioButtonList.Items[i].Margins.Left := 80;
          FRadioButtonList.Items[i].Margins.Right := 25;
          FRadioButtonList.Items[i].Top := 12;
        end;
    x: begin // x löst den Fehler aus
          FRadioButtonList.Items[i].Left := 12;
          FRadioButtonList.Items[i].Top := 12;
          FRadioButtonList.Items[i].AlignWithMargins := true;
          FRadioButtonList.Items[i].Margins.Top := 5;
          FRadioButtonList.Items[i].Margins.Bottom := 5;
          FRadioButtonList.Items[i].Margins.Left := 80;
          FRadioButtonList.Items[i].Margins.Right := 25;
        end;
    else
      begin
          FRadioButtonList.Items[i].Left := 12;
          FRadioButtonList.Items[i].Top := 12;
          FRadioButtonList.Items[i].AlignWithMargins := true;
          FRadioButtonList.Items[i].Align := alTop;
          FRadioButtonList.Items[i].Margins.Left := 80;
          FRadioButtonList.Items[i].Margins.Right := 25;
          FRadioButtonList.Items[i].Margins.Bottom := 12;
      end;
    end;

  end;
end;
Zur Zeit enthält der Frame 4 Radiobuttons. Das soll aber je nach Bedarf (und Projekt) anders sein können, ohne viel anpassen zu müssen.
if-Abfragen wollte ich bewusst nicht verwenden. Gibts da trotzdem eine Lösung?

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
Delphi.Narium

Registriert seit: 27. Nov 2017
2.558 Beiträge
 
Delphi 7 Professional
 
#2

AW: Konstantenausdruck erwartet

  Alt 26. Jan 2019, 13:05
Case geht nicht mit Variabeln, links vom Doppelpunkt muss eine Konstante stehen.
Delphi-Quellcode:
if i = 0 then ...
else if i = FRadioButtonList.Count -1 then ...
else der Rest
ist genauso flexibel wie Dein Case. Zwei Werte (1. und letztes Element) werden explizit abgefragt, der Rest geht in die Else am Ende.
Delphi-Quellcode:
procedure TRadioButtonsFrame.RadioButtonPosition;
  var i, x, y: Integer;
begin
  x := FRadioButtonList.Count - 1;
  For i := 0 to x do
  begin
    FRadioButtonList.Items[i].Left := 12;
    FRadioButtonList.Items[i].Top := 12;
    FRadioButtonList.Items[i].AlignWithMargins := true;
    FRadioButtonList.Items[i].Margins.Top := 5;
    FRadioButtonList.Items[i].Margins.Bottom := 5;
    FRadioButtonList.Items[i].Margins.Left := 80;
    FRadioButtonList.Items[i].Margins.Right := 25;
    if (i > 0) and (i < x) then FRadioButtonList.Items[i].Align := alTop;
  end;
end;
Wenn man dann noch in allen Fällen identische Codeteile nicht mehrfach aufführt, wird das schon deutlich kürzer.
  Mit Zitat antworten Zitat
Dennis07

Registriert seit: 19. Sep 2011
Ort: Deutschland
491 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Konstantenausdruck erwartet

  Alt 27. Jan 2019, 09:24
Oder du indizierst die Werte im Array/Set und prüfst den wert im case :

Delphi-Quellcode:
function IndexInt(const AValue: Integer; const AArray: TArray<Integer>): Integer;
begin
  for Result := Low(AArray) to High(AArray) do
  begin
    if AArray[Result] = AValue then
    begin
      Exit;
    end;
  end;
  Result := Pred(Low(AArray));
end;

var
  X: Integer = 45;
begin
  case IndexInt(X, [0, 45]) of
    0: {...}; //(x = 0)
    1: {...}; //(x = 45)
  end;
end.
Wenn du Lina Components installiert hast, dann hast du in der Unit uSysTools dafür die überladenen Routinen ArrayPos({...})
Dennis
  Mit Zitat antworten Zitat
Delbor

Registriert seit: 8. Okt 2006
Ort: St.Gallen/Schweiz
1.192 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Konstantenausdruck erwartet

  Alt 27. Jan 2019, 18:59
Hi zusammen

Wenn man dann noch in allen Fällen identische Codeteile nicht mehrfach aufführt, wird das schon deutlich kürzer.
Das hab ich mir mal ganz schnell zu Herzen genommen so ganz nach dem DRY-Prinzip.
Damitsieht eine Umsetzung - es ist nicht die einzige - jetzt so aus:
Delphi-Quellcode:
procedure TRadioButtonsFrame.RadioButtonPosition2;
  var i, x, y, LHeight: Integer;
begin
  x := FRadioButtonList.Count - 1;

  For i := 0 to x do
  begin
    LHeight := (i+1) * FRadioButtonList.Items[i].Height;
    FRadioButtonList.Items[i].Left := 12;
    FRadioButtonList.Items[i].Top := LHeight;
    FRadioButtonList.Items[i].AlignWithMargins := true;
    FRadioButtonList.Items[i].Margins.Top := 5;
    FRadioButtonList.Items[i].Margins.Right := 25;
    FRadioButtonList.Items[i].Margins.Bottom := 5;
    FRadioButtonList.Items[i].Margins.Left := 80;

// if i = 0 then
// FRadioButtonList.Items[i].Top := PnlRadioButtons.ClientHeight div 4;
// if i = x then
// FRadioButtonList.Items[i].Align := alTop;
  end;
end;
Die auskommentierten Zeilen sind
  • Im ersten Fall 'versuchsweise' auskommentiert
  • Im zweiten Fall kontraproduktiv, da <Align:=alTop> gesetzte Elemente über den bereits alTop gesetzten Elementen angeordnnet werden
Das Ergebnis :
Radiobuttonposition2.jpg

Eine weitere Version, aufgrund des obigen Ergebnisses:

Delphi-Quellcode:
procedure TRadioButtonsFrame.RadioButtonPosition3;
  var i, x, y, LHeight : Integer;
begin
  x := FRadioButtonList.Count -1;
  i := 0;
  FRadioButtonList.First;

  While i <= X do
  begin
    FRadioButtonList.Items[i].Left := 12;
    FRadioButtonList.Items[i].AlignWithMargins := true;
    FRadioButtonList.Items[i].Margins.Top := 5;
    FRadioButtonList.Items[i].Margins.Bottom := 5;
    FRadioButtonList.Items[i].Margins.Left := 80;
    FRadioButtonList.Items[i].Margins.Right := 25;
    LHeight := (i+1) * FRadioButtonList.Items[i].Height;
    if i = 0 then
      FRadioButtonList.Items[i].Top := LHeight+PnlRadioButtons.Height div 4
    else
      FRadioButtonList.Items[i].Top := LHeight;


// if i = x then
// FRadioButtonList.Items[i].Align := alTop;
    inc(i);
    FRadioButtonList.NextRec;
  end;
Und das Resultat:
Radiobuttonposition3.jpg

Die Radiobuttons befinden sichin einer Objectliste:
Delphi-Quellcode:
constructor TRadioButtonsFrame.Create(AOwner: TComponent);
begin
  inherited;
  FRadioButtonList := TDataObjectList<TRadioButton>.Create();
  FRadioButtonList.OwnsObjects := True;
  FRadioButtonList.Capacity := 5;
  FRadioButtonList.insert(0,RadBtnPdf);
  FRadioButtonList.Insert(1, RadBtnBitmap);
  FRadioButtonList.Insert(2, RadBtnExif);
  FRadioButtonList.Insert(3, RadBtnJpeg);
// RadioButtonPosition3;
end;
Die Elemente sollen mit deutlichem Abstand zum Left und Top des Containers (Hier Panel) angeordnet werden.


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
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.960 Beiträge
 
Delphi 12 Athens
 
#5

AW: Konstantenausdruck erwartet

  Alt 27. Jan 2019, 19:19
Etwas übersichtlicher würde es ja schon, wenn das Innere der Schleife in eine Prozedur ausgelagert wäre.

Wie soll die Anordnung denn eigentlich aussehen? Vielleicht lässt sich da ja auch etwas mit flowpanel oder ähnlichem machen.
Sebastian Jänicke
AppCentral
  Mit Zitat antworten Zitat
Delbor

Registriert seit: 8. Okt 2006
Ort: St.Gallen/Schweiz
1.192 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: Konstantenausdruck erwartet

  Alt 27. Jan 2019, 19:36
Hi jaenicke

Es sollte in etwa so aussehen, wie im 1. Anhang, wobei die Reihenfolge so sein sollte, wie in der Objectliste, wobei alle die selben Leftwerte haben sollten, aber nur das erste Element einen grösseren Topwert.
Wieso eines der Elemente in meiner While-Schleife "verschluckt" (überzeichnet?) wird, kann ich mir im Moment nicht erklären.

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
Antwort Antwort


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 19:40 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz