Autor |
Beitrag |
Arne Danikowski
      
Beiträge: 194
|
Verfasst: 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
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
      
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
|
Verfasst: 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 
      
Beiträge: 194
|
Verfasst: So 23.09.07 10:18
Und wie soll ich das anstellen?
|
|
jasocul
      
Beiträge: 6393
Erhaltene Danke: 147
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: 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 
      
Beiträge: 194
|
Verfasst: 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:
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????); ini2 := ini.WriteString('colums1', 'Breite', dbgrid1.Columns????); 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
      
Beiträge: 6393
Erhaltene Danke: 147
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: 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):
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. 
|
|
Arne Danikowski 
      
Beiträge: 194
|
Verfasst: 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
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| breite1:= dbgrid1.Columns[0].Width; pos1:=dbgrid1.Columns[0].Index ; ini.WriteInteger('Grideinstellung', 'Position1', pos1); ini.WriteInteger('Grideinstellung', 'Breite1', breite1);
pos1:=ini.ReadInteger('Grideinstellung', 'Position1', (0)); breite1:=ini.ReadInteger('Grideinstellung', 'Breite1', (50));
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
      
Beiträge: 6393
Erhaltene Danke: 147
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: 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 
      
Beiträge: 194
|
Verfasst: Do 27.09.07 19:37
Ok. Ich Versuche es mal so:
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 ini.free end; end; |
Ich ändere die Reihenfolge und die Spaltenbreite, dann kommt das in der Ini Datei raus:
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.
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 ini.free end; end; |
Das geht dann auch nicht. Da ist noch irgendwo der Wurm drin.
|
|
jasocul
      
Beiträge: 6393
Erhaltene Danke: 147
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: 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 
      
Beiträge: 194
|
Verfasst: 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
      
Beiträge: 6393
Erhaltene Danke: 147
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: 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. 
|
|
Arne Danikowski 
      
Beiträge: 194
|
Verfasst: 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
      
Beiträge: 6393
Erhaltene Danke: 147
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: 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.
|
|