Autor Beitrag
lilalaunebaer
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mo 10.02.03 16:21 
Hallo !

Ich habe ein kleines aber feines Problem. Habe mir eine Komponente gebastelt, deren Quelltext ich hier mal aufs nötigste darstelle.
ausblenden volle Höhe 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:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
type TKirchComboBox = class(TComboBox)
  private
    FHasSelection:Boolean;
            
    function  GetFSQL: String;
    procedure SetSQL(const Value: String);

    function  GetDataBaseName: String;
    procedure SetDataBaseName(const Value: String);

    procedure SetHasAll(const Value: Boolean);

  protected
    procedure Change; override;

  public
    FQuery : TQuery;
    constructor Create(AOwner: TComponent); override;
    destructor Destroy; override;

    // Keine Auswahl aus den Feldern
    property  _HasSelection: Boolean read FHasSelection;
    procedure RefreshContent;

  published
    // Text, der dann angezeigt werden soll
    property _NoSelectionText: String read GetFNoSelText write SetFNoSelText;
    property _SQLText:String read GetFSQL write SetSQL;
    property _DataBaseName:String read GetDataBaseName write SetDataBaseName;
    property _HasAll:Boolean read FHasAll write SetHasAll;
  end;

implementation

//[...]
procedure TKirchComboBox.SetSQL(const Value: String);
begin
  if FQuery.DatabaseName <> '' then begin
   FQuery.SQL.Text := Value;
   FQuery.Active := true;
   RefreshContent;
  end;
end;


Hier kommt das Problem:
Wenn ich in der Entwicklungsumgebung die Eigenschaft _SQLText setze, funktioniert auch alles, die Box wird gefüllt.
Wenn ich nun aber das Programm starte, kennt die CB die SQL-Anweisung nicht mehr, die in der Entwicklungsumgebung noch vorhanden war. Ich habe mittlerweile auch herausgefunden, warum:
In den Eintragungen für die Form zum späteren Erstellen werden die eingestellten Eigenschaften folgendermaßen notiert:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
object KCBGem: TKirchComboBox
      [...]
      Font.Height = -11
      Font.Name = 'MS Sans Serif'
      Font.Style = []
      ItemHeight = 13
      ItemIndex = 0
      ParentFont = False
      TabOrder = 1
      OnChange = KCBGemChange
      Items.Strings = ( [blabla] )
      _NoSelectionText = 'Alle Gemeinden'
      // HIER DER FEHLER
      _SQLText = 'SELECT name FROM Gemeinden'
      _DataBaseName = 'DBMain'
      ///////////////////////////
      _HasAll = False
    end


Wie man oben sieht, kann ich schlecht eine SQL-Query aktivieren, wenn ich keine DataBase angegeben habe. Nur leider wird die Eigenschaft _DataBaseName erst NACH dem setzen der _SQLText-Eigenschaft aufgerufen, und wie man oben in er Prozedur sehen kann, geschieht natürlich nichts wenn DBName nicht gesetzt ist.

Wie kann man diese Reihenfolge ändern ? Manuell wird sie wieder überschrieben, jedesmal wieder ein fehler.

Ich möchte mir nicht das SQL merken müssen, und es bei SetDataBaseName mit if "sql_anweisung_da" then _SQLText := (<SQL-Anw>) festlegen müssen.

Gibts noch nen komfortableren weg ?

Danke für alle Vorschläge !

Moderiert von user profile iconraziel: Code- durch Delphi-Tags ersetzt.
maximus
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 896

Win XP, Suse 8.1
Delphi 4/7/8 alles prof
BeitragVerfasst: Mo 10.02.03 16:36 
Kannst du nicht die reihenfolge der property deklarationen ändern? Oder meintest du das mit manuell?

mfg mx.
Fuechsl
Hält's aus hier
Beiträge: 6



BeitragVerfasst: So 20.02.05 17:28 
Hallo miteinander,

ich habe im Prinzip dasselbe Problem. Reihenfolge manuell in .DFM ändern geht eben nicht (wie bereits erwähnt). Und wenn ich die properties in der Deklaration meiner Klasse ändere, funktioniert das zwar unter gewissen properties, aber ich kann Delphi (Version 5 bei mir) nicht dazu bringen, eine string-property erst am Schluss aufzurufen. Delphi ordnet offensichtlich die properties nach einem internen Kriterium und nimmt vermutlich zuerst die Pascal-eigenen Typen (String, integer, ...) bevor es selbstdefinierte Typen initialisiert.

Falls jemand etwas dazu weiss, bin ich sehr froh um Informationen.

Gruss, Martin
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6395
Erhaltene Danke: 149

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: So 20.02.05 18:28 
Das ändern der Property-Reihenfolge sollte man lassen, wenn die Komponente schon verwendet. Imho wird das in einem Stream abgespeichert. Wenn ich also die Reihenfolge ändere, werden die Daten den falschen Properties zugewiesen. Das geht dann nach hinten los.

Ich hatte kürzlich ein ähnliches Problem, habe aber bisher keine Lösung gefunden.
Fuechsl
Hält's aus hier
Beiträge: 6



BeitragVerfasst: So 20.02.05 18:39 
Ich habe eine Lösung gefunden:

Ich habe in der Set-procedure meiner property, die erst am Schluss aufgerufen werden soll, die Teile, die beim Laden noch nicht aufgerufen werden dürfen abgefangen durch:
ausblenden Delphi-Quelltext
1:
if not (csLoading in ComponentState) then ...					

und dann die Loaded-procedure überschrieben und dort schlussendlich diese Code-Teile aufgerufen.

Gruss, Martin

Moderiert von user profile iconraziel: Code- durch Delphi-Tags ersetzt.