Autor Beitrag
Arne Danikowski
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 194



BeitragVerfasst: Fr 21.09.07 21:19 
Hallo, also nun habe ich ne Stunde im Forum gesucht und nix gefunden. Jedenfalls nicht das was ich gesucht habe.
OK zu einigen anderen Problemen habe ich Lösungen gefunden. Echt gut son Forum :D

Aber nun zu meiner Frage. Ich habe eine Anwendung erstellt, die auf einer DBase Datenbank aufbaut ohne SQL. Ich lasse mit eine Tabelle in einem DBGrid anzeigen. Wenn die Anwendung läuft, kann ich die Spaltenbreite verändern oder die Reihenfolge der Spaltenbreite verändern, nur wenn ich die Anwendung schliesse gehen diese Dateien wieder verloren.
Ich weiss das es geht, aber nicht wie.

Wie speichert man die Einstellungen der Reihenfolge und der Spaltenbreite?
Matthias-K
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 271

Win95, Win98, Win2000, WinXP, Linux
D2, D4 Client/Server, D5 Enterprise, D6 Enterprise, D7 Enterprise, Delphi2005, C/C++ 3.0, C/C ++ 5.0, C/C++ 6.0
BeitragVerfasst: Sa 22.09.07 00:10 
naja,

nimm ne ini und speicher die sachen! alternativ in de registry.

musst halt bloß ne routine basteln, die beim programmstart die einstellungen wieder lädt!

erkenn kein problem dabei.

kannst es ja, statisch machen, wenn es dir dynamisch zu schwer ist.

mfg matthias

_________________
Ein Spezialist ist ein Mensch, der immer mehr von immer weniger weis, bis er alles von nichts weis!
Arne Danikowski Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 194



BeitragVerfasst: So 23.09.07 10:18 
Und wie soll ich das anstellen?
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6393
Erhaltene Danke: 147

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Mo 24.09.07 08:18 
Du kannst Dich mit INI-Dateien beschäftigen und Dir anschauen, wie die passenden Eigenschaften des DBGrid, TTable oder TQuery aussehen.

Oder Du schaust Dir auf meiner Website im Download -Bereich den "Feld-Formatierer" an. Aber auch mit dem musst Du Dich beschäftigen. Der macht auch nicht alles von alleine. Deshalb gibt es da auch eine Kurzanleitung. (Link)
Arne Danikowski Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 194



BeitragVerfasst: Mo 24.09.07 15:05 
Danke für die Antwort.

Also mit Ini-Dateien habe ich schon einmal gearbeitet. Aber irgendwie capier ich die DBGrid Eigenschaften nicht. Das muss sich je irgendiwe zusammensetzen

um einen Wert in die Ini Datei zu schreiben:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
USES
IniFiles;

VAR
ini:TiniFile;
ini1,ini2:String;


procedure TForm1.RadioButton1Click(Sender: TObject);
begin
.....
try
ini := TIniFile.Create('C:\Windows\jpdatabase.ini');
ini1 := ini.WriteString('colums1''Colums1', dbgrid1.Columns????); //Hier muss irgendwie die erste Spalte stehen
ini2 := ini.WriteString('colums1''Breite', dbgrid1.Columns????); //Hier muss irgendwie Spalte und die width stehen

dbgrid1.Columns???:=ini1;
dbgrid1.Columns???:=ini2;
finally
ini.free


Ich gehe mal davon aus, das mit ini.ReadString der Wert dann wieder eingelesen wird.Der Code oben ist natürlich nur ein Model wie es aussehen könnte und nicht so zu verwenden.

kannst Du mir da mal einwenig auf die Sprünge helfen? für mich als Anfänger ist das echt schwer.
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6393
Erhaltene Danke: 147

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Mo 24.09.07 15:59 
Zunächst mal würde ich nicht über das DBGrid gehen, sondern über das DataSet (TTable, TQuery, o.ä.). Als Beispiel nehme ich jetzt ein TQuery (Q1):
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
USES
  IniFiles;

VAR
  ini:TiniFile;

procedure TForm1.Button1Click(Sender: TObject);
begin
  .....
  try
    ini := TIniFile.Create('C:\Windows\jpdatabase.ini');
    for i := 0 to Q1.FieldCount-1 do
    begin
      ini.WriteString(Q1.Fields[i].FieldName, 'FeldName', Q1.Fields[i].DisplayLabel);
      ini.WriteBoolean(Q1.Fields[i].FieldName, 'Sichtbar', Q1.Fields[i].Visible);
      ini.WriteInteger(Q1.Fields[i].FieldName, 'Breite', Q1.Fields[i].DisplayWidth);
      ini.WriteInteger(Q1.Fields[i].FieldName, 'Ausrichtung', Q1.Fields[i].Alignment);
      ini.WriteInteger(Q1.Fields[i].FieldName, 'Position', Q1.Fields[i].Index);
    end;
  finally
    ini.free
end;

Für das Einlesen der INI-Einstellungen, musst Du entsprechend ini.ReadString, ini.ReadBoolean, ini.ReadInteger verwenden. Dort solltest Du allerdings auch Q1.DisableControls am Anfang und Q1.EnableControls am Schluss der Routine einbauen, sonst kann das Performance- und optische Probleme geben. Ach so, Das DataSet muss zu dem Zeitpunkt geöffnet sein.

Hinweis:
Ich habe das ohne Kontrolle eingetippt. Es kann also durchaus sein, dass es noch nicht ganz korrekt ist. Aber das bekommst Du schon hin. :wink:
Arne Danikowski Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 194



BeitragVerfasst: Di 25.09.07 20:36 
Schon mal danke für die Antwort, ich bin damit schon ein ganzes Stück weitergekommen.

Über einen Button Speichere ich die Wert in eine Ini Datei
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
//Zunächst Wert in eine Variable
breite1:= dbgrid1.Columns[0].Width;
pos1:=dbgrid1.Columns[0].Index ;
//Dann in die ini Datei
ini.WriteInteger('Grideinstellung''Position1', pos1);
ini.WriteInteger('Grideinstellung''Breite1', breite1);

//Laden der Einstellungen 
pos1:=ini.ReadInteger('Grideinstellung''Position1', (0));
breite1:=ini.ReadInteger('Grideinstellung''Breite1', (50));

//Setzen der Eigenschaften
with dbgrid1 do begin
Columns[0].index:=pos1;
Columns[0].Width:=breite1;
end;


das ganze funktioniert nur solange ich nicht die Reihenfolge der Spalten ändere. Es scheint mir so, als würden die Positionen fest sein. Also Zum Beispiel Columns[0] ist immer die Spalte "Name" egal ob ich diese in der Ansicht bei laufenden Programm verändere.

Ich muss da irgendwo ein denkfehler haben. Mit TQuery arbeite ich nicht, habe keinerlei SQL im Programm und bevor Du fragst: So weit bin ich noch nicht. Das nächste Programm wird es vieleicht :)

Irgendeine Idee?
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6393
Erhaltene Danke: 147

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Mi 26.09.07 07:53 
Du kannst auch ein TTable dafür benutzen.Du musst das nur sinngemäß in meinem Code-Beispiel ersetzen. Wenn Du dann noch davon weg kommst, die Einstellungen über das DBGrid zu machen und dafür die Fields-Eigenschaft des TTable zu verwenden, dann kannst Du auch über die Eigenschaft Index die Position bestimmen (siehe letzte Einstellung in meinem Code-Beispiel).

Es ist an dieser Stelle völlig egal, ob Du TQuery oder TTable verwendest. Beides sind Nachkommen von TDataSet und verfügen daher in diesem Bereich über die selben Eigenschaften.
Arne Danikowski Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 194



BeitragVerfasst: Do 27.09.07 19:37 
Ok. Ich Versuche es mal so:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
procedure TForm1.EinstellungenLaden1Click(Sender: TObject);

Var
i:Integer;
begin
try
ini := TIniFile.Create('C:\Windows\jpdatabase.ini');
   for i := 0 to Table1.FieldCount-1 do
    begin
      Table1.DisableControls;
      ini.WriteString(Table1.Fields[i].FieldName, 'FeldName', Table1.Fields[i].DisplayLabel);
      ini.WriteInteger(Table1.Fields[i].FieldName, 'Breite', Table1.Fields[i].DisplayWidth);
      ini.WriteInteger(Table1.Fields[i].FieldName, 'Position', Table1.Fields[i].Index);
      Table1.EnableControls;
    end;
      finally
//Zugriff auf die ini Datei beenden
      ini.free
      end;
end;


Ich ändere die Reihenfolge und die Spaltenbreite, dann kommt das in der Ini Datei raus:
ausblenden volle Höhe 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:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
122:
123:
124:
125:
126:
127:
128:
129:
130:
131:
132:
[NAME]
FeldName=NAME
Breite=40
Position=0
[VORNAME]
FeldName=VORNAME
Breite=30
Position=1
[EINGANG]
FeldName=EINGANG
Breite=10
Position=2
[HAUPTBERUF]
FeldName=HAUPTBERUF
Breite=50
Position=3
[BERUFB]
FeldName=BERUFB
Breite=50
Position=4
[BERUFC]
FeldName=BERUFC
Breite=50
Position=5
[ORT]
FeldName=ORT
Breite=30
Position=6
[STATUS]
FeldName=STATUS
Breite=15
Position=7
[BEWERTUNG]
FeldName=BEWERTUNG
Breite=15
Position=8
[LAGERORT]
FeldName=LAGERORT
Breite=20
Position=9
[BEMERKUNG]
FeldName=BEMERKUNG
Breite=10
Position=10
[ID]
FeldName=ID
Breite=10
Position=11
[STRASSE]
FeldName=STRASSE
Breite=25
Position=12
[PLZ]
FeldName=PLZ
Breite=10
Position=13
[TELEFON]
FeldName=TELEFON
Breite=20
Position=14
[HANDY]
FeldName=HANDY
Breite=20
Position=15
[VERWENDUNG]
FeldName=VERWENDUNG
Breite=50
Position=16
[BERUFD]
FeldName=BERUFD
Breite=30
Position=17
[VERMITTELT]
FeldName=VERMITTELT
Breite=4
Position=18
[ABLAGE]
FeldName=ABLAGE
Breite=4
Position=19
[VORLAGE]
FeldName=VORLAGE
Breite=10
Position=20
[KENNUNG]
FeldName=KENNUNG
Breite=4
Position=21
[ARCHIV]
FeldName=ARCHIV
Breite=4
Position=22
[ARBEITGEB]
FeldName=ARBEITGEB
Breite=50
Position=23
[BEGINN]
FeldName=BEGINN
Breite=10
Position=24
[RATE]
FeldName=RATE
Breite=30
Position=25
[RATEB]
FeldName=RATEB
Breite=30
Position=26
[PAPIERK]
FeldName=PAPIERK
Breite=5
Position=27
[EINGEREICH]
FeldName=EINGEREICH
Breite=10
Position=28
[VERMALS]
FeldName=VERMALS
Breite=50
Position=29
[EINGEREI2]
FeldName=EINGEREI2
Breite=10
Position=30
[BEZAHLT1]
FeldName=BEZAHLT1
Breite=4
Position=31
[BEZAHLT2]
FeldName=BEZAHLT2
Breite=4
Position=32


Er schreibt mir also immer die absoluten Werte in die INI Datei, Unabhängig davon, wie ich sie in Grid verschiebe. NAME ist immer an POSITION 1 und die Spaltenbreite merkt er sich auch nicht.
folglich passiert auch nichts beim einladen- Auch wenn ich die INI Datei probehalber von Hand ändere.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
procedure TForm1.Einstellungenspeichern1Click(Sender: TObject);
Var
i:Integer;
begin
try
ini := TIniFile.Create('C:\Windows\jpdatabase.ini');
   for i := 0 to Table1.FieldCount-1 do
    begin
      Table1.DisableControls;
      ini.ReadString(Table1.Fields[i].FieldName, 'FeldName', Table1.Fields[i].DisplayLabel);
      ini.ReadInteger(Table1.Fields[i].FieldName, 'Breite', Table1.Fields[i].DisplayWidth);
      ini.ReadInteger(Table1.Fields[i].FieldName, 'Position', Table1.Fields[i].Index);
      Table1.EnableControls;
    end;
      finally
//Zugriff auf die ini Datei beenden
      ini.free
      end;
end;


Das geht dann auch nicht. Da ist noch irgendwo der Wurm drin.
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6393
Erhaltene Danke: 147

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Fr 28.09.07 08:26 
Ich glaube, der Fehler liegt nicht bei Dir, sondern bei meinem Vorschlag.

Bei Veränderungen im DBGrid hat das offensichtlich keine Auswirkung auf das DataSet. Mein Ansatz ist da wohl falsch gewesen. Ich bin einer meinen eigenen Komponenten ausgegangen. Dort wird nichts über das DBGrid gesteuert, da ich noch andere Dinge der Darstellung damit steuere, für die ich kein DBGrid habe.

Ich komme heute nicht dazu, mir das genauer anzusehen. Du kannst entweder selbst noch experimentieren oder bis zum Wochenende warten. Dann kann ich mir das ansehen.

Der Ansatz geht dann über das DBGrid, statt über die Table-Komponente. Müsste aber im Prinzip sehr ähnlich sein.
Arne Danikowski Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 194



BeitragVerfasst: Do 04.10.07 22:55 
So ich hab da selber noch einmal daran rumgefummelt und es wollte zum verrecken nicht funktionieren. Dennoch konnte ich nach einigen Tips in die richtige richtung eine Lösung finden.
Ich poste das, falls jemand anders eine Möglichkeit sucht, Einstellungen zu speichern. Das funktioniert nämlich nicht nur mit den Grideinstellungen.

1. RXLIBS installieren (suchen unter Google)

2. rxdbgrid einfügen und mit DataSource verbinden

3. gewünschte Felder hinzufügen

4. aus den rxtools TFormStorage einfügen

5. In den Eigenschaften des TFormStorage unter IniFileName einen beliebigen IniDateinamen wählen (mit.ini endung)

6. Unter IniSection eine Section für die IniDatei wählen z.B. Startwerte

7. Im rxdbgrid unter IniStorage das TFormStorage eintragen (Eigenschaften)

fertig. Nach dem Beenden des Programms wird automatisch eine Ini Datei angelegt, die die gewünschten Werte speichert.

Aber nochmal danke für Deine Bemühungen jasocul
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6393
Erhaltene Danke: 147

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Fr 05.10.07 08:27 
Die rxlib wird nicht mehr gepflegt. Die entsprechenden Komponenten sind aber bei Jedi mit aufgenommen worden und werden in diesem Rahmen weiter entwickelt.
Da Du gerade erst angefangen hast, die Komponenten zu verwenden, solltest Du das möglichst schnell ändern. :wink:
Arne Danikowski Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 194



BeitragVerfasst: Fr 05.10.07 11:27 
Wie die werden nicht mehr gepflegt? Ich habe doch grade die neue Version für Delphi 2007 runtergeladen! Waren das nun nur alter Dinger?

Das ja ein Ding
jasocul
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 6393
Erhaltene Danke: 147

Windows 7 + Windows 10
Sydney Prof + CE
BeitragVerfasst: Fr 05.10.07 11:48 
Schau mal hier:
www.dummzeuch.de/delphi/rxlib/deutsch.html

Da hat sich einer die Mühe gemacht, das alte Paket anzupassen. Aber gepflegt wird es regulär eben nicht mehr.