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

Registriert seit: 27. Nov 2017
2.599 Beiträge
 
Delphi 7 Professional
 
#1

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
496 Beiträge
 
Delphi 12 Athens
 
#2

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.196 Beiträge
 
Delphi 11 Alexandria
 
#3

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
Online

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

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.196 Beiträge
 
Delphi 11 Alexandria
 
#5

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
Delbor

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

AW: Konstantenausdruck erwartet

  Alt 28. Jan 2019, 08:41
Hi zusammen

Inzwischen hat sich einiges geändert, und das Ziel ist schon fast erreicht:
Delphi-Quellcode:
procedure TRadioButtonsFrame.RadioButtonPosition2;
  var i, x, y, LHeight, LLeft: Integer;
begin
  For i := 0 to x do
  begin
    FRadioButtonList.Items[i].Width := 50;
    LLeft := (PnlRadioButtons.ClientWidth div 2) - (FRadioButtonList.Items[i].Width div 2);
    LHeight := (i * FRadioButtonList.Items[i].Height) + PnlRadioButtons.ClientHeight div 3;
    FRadioButtonList.Items[i].Left := LLeft;
    FRadioButtonList.Items[i].Top := LHeight;
  end;
end;
Mein Test sah/sieht inzwischen so aus:
Ersetzen.jpg
Der Frame (grosses Radiobuttonfeld)soll das kleine Radiobutton-Panel links unten ersetzen, erledigt diese Aufgabe jeoch noch nicht wirklich zur Zufriedenheit:
Zielnichterreicht.jpg
Das erste Element sitzt zu tief. Ausserdem sollen dem Frame ohne grosse weitere Bearbeitung weitere Elemente hinzugefügt werden können und dann allenfalls die Scrollbalken des Frames aktiviert werden.
wobei ich mich allerdings frage, ob sich hier nicht die Verwendung einer Scrollbox empfehlen würde.

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.599 Beiträge
 
Delphi 7 Professional
 
#7

AW: Konstantenausdruck erwartet

  Alt 28. Jan 2019, 10:56
Wenn ich mehrere Sachen auf ein Panel pappe (automatisch) und zwischen Panelrand und Element ein Platz sein soll, dann setze ich im Panel zuerstmal BorderWidth auf 4. Man kann aber auch mehr oder weniger nehmen.

Dann werden die Elemente (meist Speedbuttons) mit Align := alTop "nach oben" gesetzt. Da das aber zu einer "umgekehrten" Reihenfolge führt, setzte ich Top dann auf die Höhe des Panels. Durch diese Kombination werden die Elemente schön von oben nach unten auf dem Panel angeordnet. Sollte eigentlich auch mit jedem anderen Container funktionieren.

Und das Panel hat bei mir immer die Breite, die die Elemente haben sollen + 2 * den Wert, den ich bei BorderWidth haben möchte. Ggfls. wird das Panel mit diesen Abmaßen dann auf einen anderen Container gepappt, um an die "richtige" Position zu kommen.

ungefähr sowas:
Delphi-Quellcode:
procedure TRadioButtonsFrame.RadioButtonPosition2;
  var i, x: Integer;
begin
  PnlRadioButtons.BorderWidth := (PnlRadioButtons.ClientWidth - FRadioButtonList.Items[0].Width) div 2;
  x := FRadioButtonList.Count - 1;
  For i := 0 to x do
  begin
    FRadioButtonList.Items[i].Top := PnlRadioButtons.Height;
    FRadioButtonList.Items[i].Align := alTop;
  end;
end;
Da in der Regel das letzte Element, das per Align := alTop eingefügt wird, ganz oben landet, kann man die Reihenfolge beim Ordnen auch einfach umkehren:
Delphi-Quellcode:
procedure TRadioButtonsFrame.RadioButtonPosition2;
  var i, x: Integer;
begin
  PnlRadioButtons.BorderWidth := (PnlRadioButtons.ClientWidth - FRadioButtonList.Items[0].Width) div 2;
  x := FRadioButtonList.Count - 1;
  for i := x downto 0 do FRadioButtonList.Items[i].Align := alTop;
end;
Kommt dabei jetzt das raus, was Du Dir vorstellst?
  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 15:07 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