Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Den Feld-Editor einer TQuery zur Laufzeit füllen (https://www.delphipraxis.net/40043-den-feld-editor-einer-tquery-zur-laufzeit-fuellen.html)

Smodibo 10. Feb 2005 10:39

Datenbank: ORACLE, SQL Server 2000 • Version: 9i, 8.0 • Zugriff über: BDE

Den Feld-Editor einer TQuery zur Laufzeit füllen
 
Hallo.

Ich benutze eine TQuery-Komponente. Zur Entwurfszeit kann über Doppelklick der Feldeditor dieser Query geöffnet werden und die Felder der angegeben Tabelle eingefügt werden.

Ich möchte aber diesen Feld-Editor zur Laufzeit füllen, doch ich weis nicht, wie ich das machen soll.

Kann mir jemand helfen?

Mfg
Smodibo

urs.liska 10. Feb 2005 10:51

Re: Den Feld-Editor einer TQuery zur Laufzeit füllen
 
Der Feld-Editor steht doch zur Laufzeit gar nicht zur Verfügung.
Wieso willst Du ihn dann Füllen?
:wiejetzt:
Urs

shmia 10. Feb 2005 11:01

Re: Den Feld-Editor einer TQuery zur Laufzeit füllen
 
Zitat:

Zitat von Smodibo
Ich benutze eine TQuery-Komponente. Zur Entwurfszeit kann über Doppelklick der Feldeditor dieser Query geöffnet werden und die Felder der angegeben Tabelle eingefügt werden.

Ich möchte aber diesen Feld-Editor zur Laufzeit füllen, doch ich weis nicht, wie ich das machen soll.

Die Felder eines TDataset (TQuery, TTable,...) sind entweder persistent (zur Entwurfszeit erzeugt) oder nicht (sie werden beim Öffen aus den Felder der unterliegenden Datenmenge generiert).
Wenn du keine persistenten Felder hast, kannst du direkt nach dem Öffnen Einfluss auf die Felder nehmen:
Delphi-Quellcode:
procedure TForm1.Query1AfterOpen(DataSet:TDataset);
begin
   Dataset.FieldByName('Password').Visible := False; // nie anzeigen

   Dataset.FieldByName('MasterKey').ReadOnly := True; // darf nie geändert werden

   TDateTimeField(Dataset.FieldByName('LastSaved')).DisplayFormat := 'YYYY.MM';
end;
So kannst du jede Eigenschaft oder Event zur Laufzeit ändern; nur eben nicht so bequem wie mit
dem Feldeditor + Objektinspektor.

Jasocul 10. Feb 2005 11:11

Re: Den Feld-Editor einer TQuery zur Laufzeit füllen
 
Was hast du damit denn genau vor?
Ich frage, weil ich eine Komponente habe, die zumindest die Darstellung in einem DBGrid konfigurieren lässt.
Wenn du es aber ReadOnly, EditMask u.ä. benötigst, würde die nicht genügen.

Smodibo 10. Feb 2005 11:28

Re: Den Feld-Editor einer TQuery zur Laufzeit füllen
 
Ich fülle ein TwwDBGrid zur Laufzeit mit bestimmten Feldern der Datenmenge. Da der Feldeditor bei mir leer ist, ist die Eigenschaft DisplayLabel der Felder nicht angepasst (z.B. NAME = Name).
Nun passiert folgendes zur Laufzeit:
- Beim drücken auf eine Spalte im Grid wird die Datenmenge nach dieser Spalte sortiert.

Bspl.:

Code:
Query.close;
Query.SQL.clear;
Query.SQL.Add('SELECT A.*, (SELECT COUNT(0) FROM TESTEN2 WHERE ID_TESTEN = A.ID_TESTEN) ANZAHL');
Query.SQL.Add('FROM TESTEN A');
Query.SQL.Add('ORDER BY A.NAME'); {Diese ORDER BY Klausel ermittle ich aus der Spalte, die ich gedrückt habe}
Query.Open;
Danach werden alle Feldnamen wieder so angezeigt, wie sie in der Datenbank stehen.
Wäre der Feld-Editor gefüllt, wie zur Entwurfszeit, dann würden die DisplayLabels so bleiben, wie
sie vor dem erneuten Öffnen der Query waren.

Durch dieses (SELECT COUNT(0) ...) in der Query kommt es zwischen ORACLE und SQL Server zu einem Konflikt, da die Feldtypen nicht gleich sind.
Folgende Fehlermeldung erscheint:
Unterschiedliche Typen für Feld 'ANZAHL'; erwartet: Float, gefunden: Integer

Mfg

Smodibo

urs.liska 10. Feb 2005 12:14

Re: Den Feld-Editor einer TQuery zur Laufzeit füllen
 
Ich glaube, wenn Du vorher (zur Entwurfszeit) nicht weißt, welche Felder Du brauchst, musst Du - entsprechend shmias Anmerkungen eben zur Laufzeit die entsprechenden Eigenschaften setzen, etwa
Delphi-Quellcode:
Dataset.FieldByName('Password').DisplayLabel := 'Passwort';
Das musst Du nach dem Neussortieren nochmal machen, aber das sollte kein Problem sein, Du kennst dann ja die Felder.

Viel Erfolg
Urs

Jasocul 10. Feb 2005 14:29

Re: Den Feld-Editor einer TQuery zur Laufzeit füllen
 
Dann sollte meine Komponente eigentlich passen, wenn sie mit deinem Grid zurecht kommt.
Formatier-Komponente
Im Programm musst du noch die Funktion ExecuteFieldmanager aufrufen.
Dokumentiert ist die Komponente noch nicht. Aber die Eigenschaften und die Einstellungsfunktion sind nicht so kompliziert.
Das ganze ist unter D5 entwickelt.
Falls du nicht zurecht kommst, melde dich.

Smodibo 11. Feb 2005 10:00

Re: Den Feld-Editor einer TQuery zur Laufzeit füllen
 
Die Formatier-Komponente ist nicht schlecht, aber schreibt in die Registry
rein.

Ich werde dann den Weg mit dem DisplayLabel zur Laufzeit setzen gehen.

Vielen Dank für die Hilfe

Smodibo

Jasocul 11. Feb 2005 10:28

Re: Den Feld-Editor einer TQuery zur Laufzeit füllen
 
Du musst nur UseINIFile auf True setzen und eine INI-Datei angeben. Dann schreibt er da rein. Ist aber zur Zeit noch etwas langsamer als die Registry. Bin gerade dabei, dass zu überarbeiten.

Smodibo 11. Feb 2005 11:08

Re: Den Feld-Editor einer TQuery zur Laufzeit füllen
 
:thumb: Habe eine andere Lösung gefunden.
Ich wandle das Feld ANZAHL unter SQL Server mit CAST in einen Float-Wert (DECIMAL) um.
Beispiel:
Code:
Query.close;
Query.SQL.clear;
Query.SQL.Add('SELECT A.*, CAST( (SELECT COUNT(0) FROM TESTEN2 WHERE ID_TESTEN = A.ID_TESTEN) AS DECIMAL) ANZAHL');
Query.SQL.Add('FROM TESTEN A');
Query.SQL.Add('ORDER BY A.NAME');
Query.Open;
Dadurch kann ich den Feld-Editor zur Entwurfszeit mit den Feldern füllen und die DisplayLabels bleiben bei einer Neusortierung erhalten.

Mfg
Smodibo


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