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/)
-   -   Delphi Mehrere ScrollBars & Editboxes verknüpfen (https://www.delphipraxis.net/91151-mehrere-scrollbars-editboxes-verknuepfen.html)

afentis 30. Apr 2007 13:44


Mehrere ScrollBars & Editboxes verknüpfen
 
hallo

Folgender Sachverhalt:
Ich habe > 500 Scrollbars in einem Formular (auf verschiedene Panels verteilt). Zu jeder Scrollbar gehört eine Edit-Box in welcher entweder der aktuelle Wert der Scrollbar angezeigt (wenn diese bewegt wird), oder ein Wert für die Scrollbar festgelegt werden soll (wenn man denWert direkt eingibt). Das funktioniert auch soweit gut, wenn ich für jede Scrollbar-Editbox-Kombination eine eigene Procedure schreibe. Für eine variable Anzahl dieser Kombinationen ist das aaber nicht möglich.

Jetzt zu meiner Frage:
Wie kann ich anhand des Senders die entsprechende Kombination, z.b. Scrollbar 385 <-> Editbox 385, ermitteln?


Delphi-Quellcode:
procedure TForm1.changeValue(Sender: TObject); // Ändern des Wertes im Edit-Feld wenn die Scrollbar bewegt wird
begin

    i:= 100 - Form1.Ch1.Position;
    Form1.Ch1Text.Text := IntToStr(i);
end;

procedure TForm1.changeValueBar(Sender: TObject); // Ändern der Scrollbar-Position, wenn ein Wert im Edit-Feld eingegeben wird
begin
        i:= StrToInt(Form1.Ch1Text.Text);
        Form1.Ch1.Position := 100 - i;
end;
mfg
afentis

mkinzler 30. Apr 2007 14:01

Re: Mehrere ScrollBars & Editboxes verknüpfen
 
Delphi-Quellcode:
(Sender as TComponent).Name
?

xZise 30. Apr 2007 14:25

Re: Mehrere ScrollBars & Editboxes verknüpfen
 
Wenn du die Scrollbar bewegst:
Delphi-Quellcode:
(FindComponent('eValue' + IntToStr((Sender as TScrollBar).Tag)) as TEdit).Text := (Sender as TScrollBar).Position
Und wenn du dann das Edit bewegst:
Delphi-Quellcode:
(FindComponent('sbValue' + IntToStr((Sender as TEdit).Tag)) as TScrollBar).Position := (Sender as TEdit).Text
Erklärung:
"FindComponent" findet die Komponente mit den übergebenen Namen auf der Form.
Also musst du in die Klammern den Namensstring davon schreiben. Bei mir heißen sie demnach "eValueX" wobei X die EditNummer ist. Die Scrollbars heißen bei mir "sbValueX"...
"Sender" gibt dir die Komponente an, welche diese Prozedur ausgelöst hat. Da es sich um den Typ "TObject" handelt, musst du ihn in ein TEdit oder in die TScrollbar casten (s.u.).
".Tag" ist eine Eigenschaft in der du ein Integer speicherst. In deinen Besonderen Fall haben sie die Nummer der Scrollbar.
Also muss die Scrollbar, welche mit dem "eValue1" verknüpft wird, den/die Tag "1" haben.

Zum Casten:
Ein Cast funzt so: <Variable> as <Datentyp> oder <Datentyp>(<Variable>). Im ersten Fall sollte man darum eine Klammer machen um die Eigenschaften abzurufen ((<Variable> as <Datentyp>).<Eigenschaft>)
Um sicher zu gehen, dass ein Cast funktioniert, kann man das mit "is" testen "<Variable> is <Datentyp>".

Ich hoffe mal du verstehst dieses Konstrukt.
Um es dir einfacher zu machen, splitte ich mal die 1. Zeile auf:
Delphi-Quellcode:
var
  e : TEdit; // Das Edit, wo wir den Wert reinschreiben
  sb : TScrollBar; // Die ScrollBar, welche sich bewegt
  tag : string; // Der/Doe/Das Tag, gleich als bequemen string
begin
  sb := (Sender as TScrollBar); // Wir schreiben unsere Scrollbar in die Variable... Dabei müssen wir casten!
  tag := IntToStr(sb.Tag); // Unser Tag wird ein string

  e := FindComponent('eValue' + // Wir suchen nun nach der Komponente mit dem namem "eValue ...
                     tag)      // ... und dem/der... Tag ...
       as TEdit;               // ... und casten das als Edit
  e.Text := IntToStr(sb.Position) // Zuletzt schreiben wir die Position der Scrollbar in das Edit
end;

afentis 2. Mai 2007 09:30

Re: Mehrere ScrollBars & Editboxes verknüpfen
 
Danke für die Antwort!
Mir war die Funktion FindComponent nicht bekannt.

mfg

xZise 2. Mai 2007 13:51

Re: Mehrere ScrollBars & Editboxes verknüpfen
 
Aber an sich ist diese Variante unelegant...
Eleganter, aber wahrscheinlich nicht in deinem Verständis ( :mrgreen: ), wäre die dynamische Erstellung von einem Edit und Scrollbar array... Sodass man mithilfe des Tags einfacher an den Index rankommt:
Delphi-Quellcode:
const SCROLLBARS_EDITS_COUNT = 10;

type
  Form1 = class(TForm)
  public
    {...}
    eValues : array [0..SCROLLBARS_EDITS_COUNT - 1] of TEdit;
    sbValues : array [0..SCROLLBARS_EDITS_COUNT - 1] of TScrollBar;
  end;

{...}
procedure TForm1.FormCreate(Sender : TObject);
var
  i : Integer;
begin
  for i := 0 to SCROLLBARS_EDITS_COUNT - 1 do
  begin
    { ... }
    eValues[i].Tag := i;
    sbValues[i].Tag := i;
  end;
end;
Später wenn du dann darauf zugreifst:
Für das Setzen des Edits:
Delphi-Quellcode:
eValues[(Sender as TScrollBar).Tag].Text := IntToStr((Sender as TScrollBar).Postion);
Für das Setzen der Scrollbarposition:
Delphi-Quellcode:
sbValues[(Sender as TEdit).Tag].Position:= StrToInt((Sender as TEdit).Text);


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