Entwickler-Ecke

Datenbanken - Viele DBEdit bearbeiten


Der Schreckliche - Fr 14.12.12 21:15
Titel: Viele DBEdit bearbeiten
Hallo ich habe viele DBEdit Felder bei denen ich die property bei allen ändern will.

Gedacht hatte ich mir das so.


Delphi-Quelltext
1:
2:
For i := 1 to 53 do
 DBEdit[i].Readonly := False;


Wie Ihr sicherlich wißt, klappe es si nicht. Bin aber zu faul für alle BDEdit eine extra Anweisung zu schreiben.

Delphi 2005, windows XP.

Ich danke euch jetzt schon für die Antworten.

Moderiert von user profile iconMartok: Delphi-Tags hinzugefügt


Xion - Fr 14.12.12 21:19

Doch das geht natürlich. Dazu musst du nur vorher alle Edits in ein Array speichern:

Delphi-Quelltext
1:
DBEdit: array of TDBEdit;                    

Du kannst die entweder gleich in diesem Array erzeugen, oder du speicherst die Instanzen nachträglich in dem Array. Bei letzterem müsstest du einmalig 53 Zeilen schreiben:

Delphi-Quelltext
1:
DBEdit[5]:=DBEdit5;                    


Ansonsten kannst du noch FindComponent benutzen, das ist aber ziemlich langsam.


Der Schreckliche - Fr 14.12.12 21:27

Ja Danke, genau so habe ich mir das Vorgestellt! :lol:


Sinspin - Sa 15.12.12 12:57

Eventuell geht es auch einfacher. Eine Form hat die Eigenschaft Components über die Du alle Komponenten auf dem Formular ansprechen kannst. Such Dir dann einfach via

Delphi-Quelltext
1:
2:
if Form.Components[i] is TDBEdit then
  (Form.Components[i] as TDBEdit).ReadOnly := true;
die raus die Du ändern willst.
Wenn du bestimmte auslassen willst, jede Komponente hat ja einen Namen gegen den Du prüfen kannst.


WasWeißDennIch - Sa 15.12.12 12:59

Irgendwie drehen wir uns langsam im Kreis: Hier [http://www.entwickler-ecke.de/viewtopic.php?t=110771]


Der Schreckliche - Sa 15.12.12 15:19

Danke, jetzt funzt es richtig!
Sorry für den Kreis drehen aber manchmal findet man nicht das was man sucht.

Nen mir die Antwort ich sage Dir die Frage. 42!


Xion - Sa 15.12.12 15:27

user profile iconDer Schreckliche hat folgendes geschrieben Zum zitierten Posting springen:
Nen mir die Antwort ich sage Dir die Frage. 42!

OT: 42 ist die Antwort! Die Frage dazu ist: "What do you get if you multiply six by nine?" (Naja, nicht wirklich natürlich. Dumme Telefondesinfizierer :mrgreen:)


Gerd Kayser - So 16.12.12 09:06

Die einfachste Lösung: Alle 53 DBEdit-Komponenten auf ein Panel legen. Mit "Panel1.Enabled := false;" kann keine Eingabe mehr erfolgen. Zwar werden die Inhalte der DBEdit-Komponenten nicht mehr ausgegraut, dafür sind sie aber wesentlich besser zu lesen.


Der Schreckliche - So 16.12.12 21:16

Mist, jetzt dachte ich habs verstanden und wieder nix!


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
var
i : Interger;
XEdit: Array[1..11of TEdit;
XDBEdit : Array81..11of TDBEdit;
begin
XEdit[1] := Edit1;
XDBEdit [1] := DBEdit1;
//usw.
For i:= 1 to 11 do
begin
XEdit[i].Top := XDBEdit[i].Top;
XEdit[i].Left := XDBEdit[i].Left;
XEdit[i].Height := XDBEdit[i].Height;
XEdit[i].Width := XDBEdit[i].Width;
end;


Beim aufrufen mault meine Mühle.
Ja ich weiss der Fehler liegt zwischen meinen Ohren aber wo in der Programmierung?
Und wie bekomme ich die Angaben hier in einen Delphi Quelltext?

Moderiert von user profile iconMartok: Delphi-Tags hinzugefügt


mandras - Mo 17.12.12 00:15

Was für ein Fehler wird denn gemeldet? Evtl einer in Zeile 4 wo steht:
array81..11?
es war wohl
array[1..11 gemeint

Zur Anfangsfrage: Ich mache sowas gerne mal wie folgt:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
procedure TForm1.Button1Click(Sender: TObject);
var i:integer;
begin
 for i:=0 to ComponentCount-1 do
  if Components[i] is TEdit then
   if (Components[i] as TEdit).Tag = 1 then
    (Components[i] as TEdit).Color := clRed;
end;


Das o.g. Beispiel sucht alle Edits im Formular, bei denen die Eigenschaft "Tag" den Wert 1 enthält und legt für diese dann als Hintergrundfarbe Rot fest.
Tag läßt sich für jede Control im Designer einstellen und eignet sich teils hervorragend um verschiedene Elemente eines Formulars zu unterscheiden.


Der Schreckliche - Mo 17.12.12 20:42

ja klar soll das Array[1..11] heißen war ein Abttipfehler meiner Seits. Aber das war nicht der Fehler.
Der Fehler war irgendwelche Zugriffs Probleme, aber ich habe es jetzt erstmal noch komplizierter gelöst, weil ich weiter kommen wollte aber bei einer Lösung springe ich dann gerne wieder meine gewünschte Lösung zurück.
Danke für den Tipp mit den Tag, kannte ich noch nicht.
Mein Problem ist, dass ich die Eigenschaften w.z.B. die Position DBEdit1 auf die Edit1 übertragen will und nicht DBEdit1 auf die Edit2 usw.
Die Frage ist, wie bekomme ich bei Componentcount die DBEdit[i] zur Edit[i] Deckungsgleich?


WasWeißDennIch - Mo 17.12.12 21:04

Da es sich wohl um Komponentenpaare handelt, würde ich diese in einer Struktur zusammenfassen:

Delphi-Quelltext
1:
2:
3:
4:
5:
type
  TEditPair = record
    DBEdit: TDBEdit;
    Edit: TEdit;
  end;

Nun das Ganze in ein Array oder eine Liste packen, einmalig die Paare zuweisen, und dann kann man schön jedes Paar einzeln abhandeln.

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
for i := 0 to Paarliste.Count - 1 do
  begin
    Pair := Paarliste[i];
    Pair.Edit.Left := Pair.DBEdit.Left;
    Pair.Edit.Top := Pair.DBEdit.Top;
    (* usw. usf. *)
  end;


Der Schreckliche - Mo 17.12.12 21:35

Ja den Grundgedanken von Dir habe ich verstanden, jetzt fuchse ich mich noch in die Kleinigkeiten rein, so ganz habe ich es noch nicht!


WasWeißDennIch - Di 18.12.12 09:24

Hier einmal ein Beispiel, wie ich mir das so vorgestellt habe. Ich gehe hier davon aus, dass die Komponenten "Edit1" bis "Edit10" bzw. "DBEdit1" bis "DBEdit10" heißen und das Formular der Owner ist.

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
type
  TEditPair = record
    DBEdit: TDBEdit;
    Edit: TEdit;
  end;
  
  TDeinForm = class(TForm)
  private
    FEditPairs: array of TEditPair;
    procedure InitializeEditPairs;
    ...
  end;
  
...

procedure TDeinForm.InitializeEditPairs;
var
  i: integer;
begin
  SetLength(FEditPairs, 10);
  for i := 1 to 10 do
    begin
      FEditPairs[i - 1].DBEdit := FindComponent(Format('DBEdit%d', [i])) as TDBEdit;
      FEditPairs[i - 1].Edit := FindComponent(Format('Edit%d', [i])) as TEdit;
    end;
end;


Ohne Gewähr, da im Editor getippt und nicht getestet.


Der Schreckliche - Mi 19.12.12 20:26

Ja das funktioniert so! Danke!
Aber was ich noch nicht verstehe, was ist das "d" hinter dem Joker?


bummi - Mi 19.12.12 20:33

Einfach mal Format anklicken und F1 drücken.

d steht für dezimal %d ist der "Platzhalter" für einen Integer


WasWeißDennIch - Mi 19.12.12 21:12

Ich kann es auch gerne umformulieren:

Delphi-Quelltext
1:
FEditPairs[i - 1].DBEdit := FindComponent('DBEdit' + IntToStr(i)) as TDBEdit;                    

Ich finde nur Format viel flexibler, aber das ist Geschmackssache.


Der Schreckliche - Mi 19.12.12 21:49

Nene, passt schon so, war nur eine Verständnisfrage!
Nochmal vielen Dank!