Entwickler-Ecke

Datenbanken - Ausgabe von Paradox7 Tabelle


Grafix - Di 28.04.09 16:14
Titel: Ausgabe von Paradox7 Tabelle
Hey,

also, wie gewünscht, neues Thema ;)
Wie kann ich meine Tabelle in tabelleform (lol) ausgeben? So ähnlich wie bei PHP hab ich mir das vorgestellt, DBGrid ist mir jedoch zu plumb und unflexibel (oder kann man das visuell anpassen?!), gibts da andere Möglichkeiten (kein Memo^^)?
lg


mkinzler - Di 28.04.09 16:39

Was verstehst du unter visuell anpassen?


Grafix - Di 28.04.09 16:40

es sollen nur bestimmte Spalten ausgegeben werden, die dann einzeln angeklickt werden können um weitere Details der gewählten Zeile zu zeigen...


mkinzler - Di 28.04.09 16:49

Schau dir mal die Eigenschaft .Columns an. Dort kannst du du anzuzeigenden Spalten auswählen.
Nähere Informationen könnte man per Hint anzeigen lassen


Grafix - Di 28.04.09 16:50

mhm ok, dass könnte schon mal helfen.
Kann ich dynamisch labels erzeugen?


mkinzler - Di 28.04.09 16:53

Was meinst du mit Labels? Spalten?


Grafix - Di 28.04.09 16:54

naja ein TLabel, dass ich mit einer Schleife zur Laufzeit erstelle und positioniere... ist sowas möglich?


mkinzler - Di 28.04.09 17:02

Ja.


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
Label := TLabel.Create(<Owner>);
Label.Parent := Parent;
Label.Top := <Oberer Rand>;
Label.Left :=<Linker Rand>:
Label.Caption := '<Text>';
...


Grafix - Di 28.04.09 17:05

yeah, dass war was ich gesucht hab =) thx!


Grafix - Do 30.04.09 12:35

mhm dein Code hat einen Fehler in Zeile 1 oder? Es kommt folgende Meldung:

[Error]statement expected but 'label' found


Delete - Do 30.04.09 12:45

Wie heißt denn Dein Label?


Grafix - Do 30.04.09 12:46

naja, ich habe es nicht gesetzt, es soll ja zur Laufzeit erst erstellt werden...


Delete - Do 30.04.09 12:49

Ich meinte ja auch die Variable. Hoffentlich nicht einfach "Label", oder?


Grafix - Do 30.04.09 12:58

... erwischt, wie dumm von mir... Nagut, ich habs jetzt verbessert, als was muss ich die Variable denn deklarieren? Als TLabel? oder als TQRLabel?
Und er akzeptiert es jetzt, aber ich kann es nicht sehen, nachdem er es eigentlich erstellt hat -.-


Delete - Do 30.04.09 13:00

TQRLabel ist ja von Quickreport. TLabel sollte richtig sein, wenn Du den nicht nutzt. Und zur Sichtbarkeit: hast Du auch den richtigen Parent angegeben?


Grafix - Do 30.04.09 13:08

habs hinbekommen, irgendwie funktionierts nicht, wenn ich Visible nicht auf True setzte..
Nochwas^^: kann ich ein Array als Variable für TLabel nehmen?


Delete - Do 30.04.09 13:11

Wie meinst Du das? Ein Array of TLabel oder wie?


Grafix - Do 30.04.09 13:12

ich möchte soviele TLabels erzeugen, wie Datensätze in der Datenbank sind. Da dass ja dynamisch sein muss, brauche ich auch X Labels, die ich ja nicht alle vorher deklarieren kann. Mir fällt nur leider keine möglichkeit ein, dass zu realisieren...


Delete - Do 30.04.09 13:17


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
var MyLabel: TLabel;
    oben: integer;
begin
  Dataset.Open;
  oben := 10;
  while not Dataset.EOF do
    begin
      MyLabel := TLabel.Create(self);
      MyLabel.Top := oben;
      //... usw. wie oben
      inc(oben,10);
      Dataset.Next;
    end;
end;

So legst Du entsprechend viele Labels an, die mit einem Abstand von 10 Pixeln untereinander liegen.


Grafix - Do 30.04.09 13:21

klasse funktioniert!! Danke!


Grafix - Do 30.04.09 13:25

gibt es eine möglichkeit die Datenbank vor abruf zu sortieren?


Delete - Do 30.04.09 13:26

Man sortiert doch keine Datenbank, sondern die abzufragende Datenmenge (z.B. per SQL mit ORDER BY).


Grafix - Do 30.04.09 13:45

jep schon klar. Kann man das ohne SQL hier einbauen?


Delphi-Quelltext
1:
2:
3:
4:
5:
 while not Tabel1.eof do
 begin
  Vorname.Caption := Tadressen_main.FieldByName('Vorname').AsString;
  Tadressen_main.next;
 end;


Delete - Do 30.04.09 13:47

Sicher, das hat mit SQL ja nichts zu tun. Allerdings überschreibst Du so die Caption ja immer wieder, das ist also ein sinnfreies Beispiel ;)


Grafix - Do 30.04.09 13:50

das kommt davon wenn man seinen code kürzt^^ nagut:


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
 while not Tabel1.eof do
 begin
  Vorname := TLabel.Create(self);
  Vorname.Parent := SBInhalt;
  Vorname.Top := top;
  Vorname.Left := 50;
  Vorname.Caption := Tadressen_main.FieldByName('Vorname').AsString;
  Tadressen_main.next;

  inc(top, 30);
 end;


wie kann ich dies nun sortieren? Nehme mal an man muss vor der While-Schleife einen befehl einfügen (z.B. Tabel1.Sort;). gehe jedoch mal davon aus, dass es nicht so einfach ist^^


Delete - Do 30.04.09 13:59

Ich weiß ehrlich gesagt gar nicht, ob TTable eine derartige Funktionalität besitzt. Was spricht denn dagegen, die Table durch eine Query zu ersetzen?


Grafix - Do 30.04.09 15:13

hab jetzt versucht, SQL einzubinden. SQL Abfragen kann ich formulieren, jedoch weiß ich nicht, wie man dessen Ergebnis ausgibt?! Bisher habe ich:


Delphi-Quelltext
1:
2:
3:
4:
 QAbfrage.Active := False;
 QAbfrage.Sql.Clear;
 QAbfrage.Sql.Add('SELECT * FROM adressen ORDER BY Nachname');
 QAbfrage.Active := True;


Wie kann ich das nun in einer While Schleife alles ausgeben?


Delete - Do 30.04.09 15:56

Na so wie bei einer Table auch.

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
QAbfrage.Close;
QAbfrage.Sql.Text := 'SELECT * FROM adressen ORDER BY Nachname';
QAbfrage.Open;
while not QAbfrage.EOF do
  begin
    //Daten ausgeben
    QAbfrage.Next;
  end;


Grafix - Do 30.04.09 16:00

aber ich weiß nicht wie dieses Daten Ausgeben formuliert sein muss, QAbfrage.WAS?
Sry, ich habe in Delphi noch nie mit SQL gearbeitet, habe mir zwar dieses Tutorial durchgelesen (http://www.delphi-treff.de/tutorials/datenbanken/datenbanken-fuer-fortgeschrittene), aber da kommts nicht wirklich raus... Und im Internet habe ich auch nichts brauchbares gefunden.

EDIT: URL eingefügt


Delete - Do 30.04.09 16:05

Der Kommentar war doch nur eine Abkürzung. Daten ausgegeben hast Du mit der TTable doch auch, das geht mit einer Query nicht anders. Beispiel:

Delphi-Quelltext
1:
2:
3:
4:
5:
while not Query.EOF do
  begin
    Listboxnamen.Items.Add(Query.FieldByName('Name').Value + ', ' + Query.FieldByName('Vorname').Value);
    Query.Next;
  end;

Das würde Dir z.B. Namen von Personen aus der Tabelle in eine Listbox schreiben.


Grafix - Do 30.04.09 16:13

klasse, jetzt funktionierts. Dass das eine Abkürzung war, ist mir schon klar, nur ich wusste nicht dass es mit einem TQuery genauso ist wie mit der TTable. Danke!


Grafix - Do 30.04.09 17:03

Könnt ihr mir sagen, wieso ich den Quelltext Teil nicht in die Prozedur auslagern kann???
Die Fehlermeldung die kommt ist eine Access Violation...


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:
44:
45:
46:
47:
procedure erstelle_Kontakte;
 var top: integer;
     QAbfrage: TQuery;
     SBInhalt: TScrollBox;
     Panel: TPanel;
     Name: TLabel;
begin
 top := 500;

 while not QAbfrage.Eof do
 begin
  //Panel erzeugen
  Panel := TPanel.Create(Form1);
  Panel.Parent := SBInhalt;
  Panel.Top := top;
  Panel.Left := 5;

  Name := TLabel.Create(Form1);
  Name.Parent := Panel;
  Name.Top := 10;
  Name.Left := 5;
  Name.Height := 26;
  Name.AutoSize := False;
  Name.Align := alBottom;
  Name.Alignment := taCenter;
  Name.Caption := QAbfrage.FieldByName('Vorname').AsString + (' ') + QAbfrage.FieldByName('Nachname').AsString;

  inc(top, 50);
  QAbfrage.next;
 end;

end;

procedure TForm1.ESucheClick(Sender: TObject);
begin
 ESuche.Clear;
end;

procedure TForm1.BSucheClick(Sender: TObject);
begin
 QSuche.Active := False;
 QSuche.SQL.Clear;
 QSuche.SQL.Text := ('SELECT * FROM adressen WHERE Nachname LIKE "%' + ESuche.Text + '%" OR Vorname LIKE "%' + ESuche.Text + '%"');
 QSuche.Active := True;

 erstelle_Kontakte;
end;


mkinzler - Fr 01.05.09 11:36

Label war auch nur als Platzhalter für den Variablennamen gemeint


Delete - Mo 04.05.09 14:02

QAbfrage ist ja auch weder erzeugt noch ausgeführt worden. Außerdem halte ich es für fragwürdig, die Komponenten auf diese Art und Weise dynamisch anzulegen. Gut, der Owner gibt sie später wieder frei, aber dolle ist das nicht.