Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Deklaration ändern ? (https://www.delphipraxis.net/95998-deklaration-aendern.html)

HolgerCW 17. Jul 2007 14:43


Deklaration ändern ?
 
Hallo,

wie kann ich in einer Procedure eine Deklaration ändern.

Möchte in meiner Procedure Comboboxen oder TTabControls füllen.

Wenn man ein TTabControl füllen will, soll Die Variable Box als TTabControl.Tabs deklariert werden, ansonsten als TComboBox.

Gruss

Holger

SirThornberry 17. Jul 2007 14:46

Re: Deklaration ändern ?
 
Zitat:

Wenn man ein TTabControl füllen will, soll Die Variable Box als TTabControl.Tabs deklariert werden, ansonsten als TComboBox.
also soll die Variable Box sowohl von dem einen Typ als auch vom anderen Typ sein?! Dann müsste man einen gemeinsamen Vorfahren finden. Wenn du TTabControl und TComboBox hättest wäre das TWinControl etc.
du schreibst allerdings etwas von einem Typ TTabControl.Tabs wobei Tabs ja dann ein Member wäre aber kein Typ :gruebel:

RavenIV 17. Jul 2007 14:52

Re: Deklaration ändern ?
 
a) Entweder Du findest einen gemeinsamen Vorfahren der Typen, die Du übergeben willst (wie schon geschrieben wurde)
oder
b) Du überlädst (overload) die Funktion

HolgerCW 17. Jul 2007 14:56

Re: Deklaration ändern ?
 
Ohh, da habe ich mich vertan.

Es geht um die Deklaration von TTabControl und TComboBox

Delphi-Quellcode:
ComboBox1.items.Add('')
oder

Delphi-Quellcode:
TTabControl.Tabs.Add('');
Ich könnte der Procedure z.B. mit einer 1 = TTabControl und 2 = TComboBox mitgeben.

Wie kann ich nun in der procedure TTabControl oder TComboBox füllen ?

Vorher hatte ich in der Procedure fest = Box: TComboBox

Gruss

Holger


P.S.:
Hier die derzeitige Procedure ohe TTabControl:

Delphi-Quellcode:
ComboBox_fuellen (Box:TComboBox; Query:TQuery; Spalten:String; Anzahl:Integer; SQL: String);

HolgerCW 17. Jul 2007 14:58

Re: Deklaration ändern ?
 
TWinControl hat kein .Clear;

Gruss

Holger

Bernhard Geyer 17. Jul 2007 14:58

Re: Deklaration ändern ?
 
Das Property items und Tabs sind beide vom Typ TStrings. Also benötigst du eine Funktion die als Übergabeparameter ein TStrings besitzt.

RavenIV 17. Jul 2007 14:59

Re: Deklaration ändern ?
 
Also hier würde ich den von mir erwähnten Punkt b) bevorzugen.
Sonst musst Du innerhalb der procedure noch entscheiden, um welchen Typ Box es sich handelt.

SirThornberry 17. Jul 2007 15:01

Re: Deklaration ändern ?
 
@Klaus: muss er nicht
Delphi-Quellcode:
DieProcedure(Combobox1.Items);
DieProcedure(TabControl1.Tabs);
[...]
procedure TYourClass.DieProcedure(Items: TStrings);
begin
  Items.Add('');
end;

RavenIV 17. Jul 2007 15:03

Re: Deklaration ändern ?
 
müsste es nicht heissen:
Delphi-Quellcode:
procedure TYourClass.DieProcedure(var Items: TStrings);

Bernhard Geyer 17. Jul 2007 15:06

Re: Deklaration ändern ?
 
Zitat:

Zitat von RavenIV
müsste es nicht heissen:
Delphi-Quellcode:
procedure TYourClass.DieProcedure(var Items: TStrings);

Nö. Nur wenn du die Items in der Funktion erzeugen willst. Nicht wenn es schon vorhanden ist.

SirThornberry 17. Jul 2007 15:06

Re: Deklaration ändern ?
 
nein, weil TStrings eine Klasse ist und eine Objectinstanz ein Pointer. Es ist also als würde man einen Pointer übergeben. Und da kann man auch einfach das ändern worauf der Pointer zeigt.
var verwendet man wenn der Übergabeparameter in der Funktion geändert werden können soll, aber nicht wenn nur das geändert werden soll worauf der Parameter zeigt.
Selbst ohne var kannst du ja
Delphi-Quellcode:
Object_Instance_Parameter.Methode()
aufrufen was dann etwas ändert. Du änderst also nicht den Übergabeparameter sondern der Übergabeparameter ändert seinen Inhalt anhand der Methoden.

HolgerCW 17. Jul 2007 15:17

Re: Deklaration ändern ?
 
OK,

und wie bekomme ich das jetzt umgesetzt: (Bin noch nicht so der Profi)

Wo implementiere ich das:

Delphi-Quellcode:
ComboBox_fuellen(Combobox1.Items);
ComboBox_fuellen(TabControl1.Tabs);
und wo das:

Delphi-Quellcode:
TYourClass
Kenne mich mit Klassendeklarationen noch nicht so aus.

Als was deklariere ich die Klasse TYourClass.

Ich habe die proceduren alle in einer eigenständigen Unit, also ohne Form

Gruss

Holger

HolgerCW 17. Jul 2007 15:20

Re: Deklaration ändern ?
 
So sieht das bei mir zur Zeit aus:

Delphi-Quellcode:
unit Unit_Funktionen;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, Buttons, ExtCtrls, DB, DBTables;

procedure ComboBox_fuellen (Box:TComboBox; Query:TQuery; Spalten:String; Anzahl:Integer; SQL: String);

...

implementation

uses
 Unit_Query_TerMaS;


//ComboBox aus DB füllen
procedure ComboBox_fuellen (Box:TComboBox; Query:TQuery; Spalten:String; Anzahl:Integer; SQL: String);
var
 I: Integer;
 S: Integer;

...

end;

HolgerCW 18. Jul 2007 09:43

Re: Deklaration ändern ?
 
Hallo,

kann mir da keiner mehr helfen. Jetzt soll nämlich in der Procedure auch noch die DBComBoBox verarbeitet werden können ..

Gruss

Holger

Bernhard Geyer 18. Jul 2007 09:47

Re: Deklaration ändern ?
 
Delphi-Quellcode:
procedure StringList_fuellen (Strings: TStrings; Query: TQuery; Spalten: String; Anzahl: Integer; SQL: String);
begin
 ...
Ist dir damit geholfen?

HolgerCW 18. Jul 2007 09:53

Re: Deklaration ändern ?
 
OK,

aber ich muss meiner Procedure doch noch übergeben in welche TComboBox oder TTAbControl die Strings übergeben werden. Die Strings werden auch erst in der Procedure ausgelesen. Hier mal die komplette Procedure:

Delphi-Quellcode:
//ComboBox aus DB füllen
procedure ComboBox_fuellen (Box:TComboBox; Query:TQuery; Spalten:String; Anzahl:Integer; SQL: String);
var
 I: Integer;
 S: Integer;
 E: Integer;
 Z: Integer;
 AktuelleSpalte: String;
 CBText:String;
 MyInt: Integer;
begin
 I:= 1; //Zähler für Anzahl der Spalten
 S:= 1; //Ende von aktueller Spalte
 E:= 1; //Ende von vorheriger Spalte
 Z:= 0; //Das kein Bindestrich mehr angefügt wird
 Box.Clear;
 Query.Close;
 If SQL <> '' then Query.SQL[1] := SQL; //SQL optional
 Query.open;
 while Query.Eof <> true do
 begin
  for I := 1 to Anzahl do
  begin
   Z := Z + 1;
   for S:= E to length(Spalten) do
   begin
    //Trennen der Spalten
    if copy(Spalten,S,1) = ';' then
    begin
     AktuelleSpalte := copy(Spalten,E,S - E);
     break;
    end;
   end;

   //Prüfen auf Nummerische oder String - Spalte
   if TryStrToInt(Query[AktuelleSpalte], MyInt) = false then
   begin
    CBText := CBText + Query[AktuelleSpalte];
   end
   else
   begin
    CBText := CBText + inttostr(Query[AktuelleSpalte]);
   end;

   //Trennzeichen einfügen
   if (Anzahl > 1) and (Anzahl <> Z) then CBText := CBText + ' - ';
   E := S + 1;
  end;
  I:= 1;
  //Text in ComboBox schreiben
  Box.items.Add(CBText);
  CBText := '';
  Z:= 0;
  E:= 1;
  S:= 1;
  Query.next;
 end;
end;
Gruss

Holger

DeddyH 18. Jul 2007 11:15

Re: Deklaration ändern ?
 
Noch mal ein Beispiel, das mit allen Abkömmlingen von TStrings funktionieren sollte (ich habe hier zur Verdeutlichung eine Memo, eine ComboBox und eine Listbox auf meiner Demo-Form):
Delphi-Quellcode:
procedure DoSomethingSenseless(sl: TStrings);
var i: integer;
begin
  sl.BeginUpdate;
  sl.Clear;
  for i := 1 to 100 do
    sl.Add(Format('Eintrag %d',[i]));
  sl.EndUpdate;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  DoSomethingSenseless(ListBox1.Items);
  DoSomethingSenseless(Memo1.Lines);
  DoSomethingSenseless(ComboBox1.Items);
end;

HolgerCW 18. Jul 2007 11:58

Re: Deklaration ändern ?
 
Hallo,

jetzt ist der Groschen gefallen. Da hatte ich wohl ein Brett vor em Kopf

Jetzt heisst meine Procedure TStrings_fuellen.

Man war das eine Geburt und eigentlich ganz einfach ...

Gruss

Holger


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