![]() |
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:
mfg
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; afentis |
Re: Mehrere ScrollBars & Editboxes verknüpfen
Delphi-Quellcode:
?
(Sender as TComponent).Name
|
Re: Mehrere ScrollBars & Editboxes verknüpfen
Wenn du die Scrollbar bewegst:
Delphi-Quellcode:
Und wenn du dann das Edit bewegst:
(FindComponent('eValue' + IntToStr((Sender as TScrollBar).Tag)) as TEdit).Text := (Sender as TScrollBar).Position
Delphi-Quellcode:
Erklärung:
(FindComponent('sbValue' + IntToStr((Sender as TEdit).Tag)) as TScrollBar).Position := (Sender as TEdit).Text
"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; |
Re: Mehrere ScrollBars & Editboxes verknüpfen
Danke für die Antwort!
Mir war die Funktion FindComponent nicht bekannt. mfg |
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:
Später wenn du dann darauf zugreifst:
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; Für das Setzen des Edits:
Delphi-Quellcode:
Für das Setzen der Scrollbarposition:
eValues[(Sender as TScrollBar).Tag].Text := IntToStr((Sender as TScrollBar).Postion);
Delphi-Quellcode:
sbValues[(Sender as TEdit).Tag].Position:= StrToInt((Sender as TEdit).Text);
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:13 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