| Autor |
Beitrag |
LuckyStrike4life
      
Beiträge: 196
Win 2000, XP, SuSE Linux 8.2
D5 Enterp.
|
Verfasst: Mi 11.06.03 14:05
Morgen,
weiteres Problem. Die von mir verwendeten DBEdit Felder dienen immer auch zur Ausgabe, was nicht zwingend gut sein muss.
Sobald irgendwas im Grid angecklickt wird (zur Laufzeit), stehen in den eigentlichen Eingabefeldern auch immer gleich die längst eingegebenen Daten. Das darf aber nicht sein, da nicht einfach jemand etwas verändern darf, was er nicht selbst geschrieben hat. Sprich - mit dem Abschicken der Informationen hat niemand, ausser der Chefs, mehr das Recht was zu verändern.
Gibt es eine Möglichkeit die DBEdit Komponenten so einzustellen, dass sie nicht mehr auch zur Ausgabe funktionieren? Oder gibt es eine andere Möglichkeit zu verhindern, dass alte Daten geändert werden können?
|
|
biohazard
      
Beiträge: 89
|
Verfasst: Mi 11.06.03 14:25
Wenn ich das richtig verstanden habe, dann reicht es doch wenn du die Eigenschaft readonly = true setzt. (Kannst du auch im Obektinspektor machen).
|
|
LuckyStrike4life 
      
Beiträge: 196
Win 2000, XP, SuSE Linux 8.2
D5 Enterp.
|
Verfasst: Mi 11.06.03 14:49
Hast du leider nicht richtig verstanden.
Die DBEdit's sind zur Eingabe da, eben nicht zur Ausgabe. Wenn ich die auf readonly setze, kann man ja nur noch damit etwas ausgeben.
Auch bringt es nichts wenns Grid auf readonly steht, dass ist davon unbeeindruckt, weil man ja direkt am Grid eh nichts eingiben kann.
|
|
biohazard
      
Beiträge: 89
|
Verfasst: Mi 11.06.03 15:25
Also,
1. wenn du auf das DBGrid klickst willst du, daß die Daten nicht in den DBEdit-Feldern angezeigt werden.
2. Du willst über die Edit-Felder neue Datensätze eingeben.
Wenn die Edits überhaupt nicht zur Ausgabe dienen sollen, dann trenne sie doch von der Datenbank (DataSource).
Und wenn du einen neuen Datensatz eingeben willst stellst du vorübergehen wieder eine Verbindung her.
Hab ich das jetzt richtig verstanden?
|
|
LuckyStrike4life 
      
Beiträge: 196
Win 2000, XP, SuSE Linux 8.2
D5 Enterp.
|
Verfasst: Mi 11.06.03 15:32
Sehr richtig  ,
das ist natürlich keine schlechte Idee. Kennst du den nötigen Code dazu? Ansonsten müsste ich ihn mir mühsam zusammen suchen/reimen.
Würde mir sehr helfen.
|
|
hwb
      
Beiträge: 91
Win98 SE, Win2000
D5 Prof
|
Verfasst: Mi 11.06.03 15:48
Das mußt du wohl selber ZUSAMMENSUCHEN.
Warum nimmst du nicht einfache Editfelder ? Da brauchst du keine Verbindung.
HWB
|
|
biohazard
      
Beiträge: 89
|
Verfasst: Mi 11.06.03 15:49
z.B. so:
Quelltext 1: 2: 3: 4: 5: 6: 7:
| procedure TForm1.Button1Click(Sender: TObject); begin table1.Append; table1.FieldByName('xxx').AsString := dbedit1.text; ... usw. table1.Post; end; |
Du erstellst einen neuen leeren Datensatz (mit append) und dann weißt du den Tabellenfeldern den Inhalt der Textbox zu. Eigentlich brauchst du dafür noch nicht mal DBEdits, das geht auch mit normalen Edits. Und am Ende speicherst du ihn (mit post).
Es gibt wahrscheinlich noch bessere Lösungen. Das ist aber die einzige die ich z.Z. kenne.
|
|
LuckyStrike4life 
      
Beiträge: 196
Win 2000, XP, SuSE Linux 8.2
D5 Enterp.
|
Verfasst: Mi 11.06.03 16:07
Danke,
werde ich morgen ausprobieren. Jetzt ist erstmal Feierabend.
Melde mich garantiert nochmals deswegen  .
|
|
LuckyStrike4life 
      
Beiträge: 196
Win 2000, XP, SuSE Linux 8.2
D5 Enterp.
|
Verfasst: Do 12.06.03 08:15
Juhuu es geht,
dein Code ist richtig und mein Problem damit gelöst. Man muss nur noch beachten das man keine DBEdit Komponenten verwenden kann, denn wenn man die von der Tabelle trennt, können sie zur Laufzeit nicht mehr beschrieben werden.
Daher ganz normal TEdit nutzen  .
Vielen Dank für deine Hilfe!!
Aber eine Sache ist noch,
ich hab auch DBCheckBoxen verwenden müssen. Wenn ich da auf einfache TCheckBoxen umsteige, wie würde denn dann der Code aussehen?
Quelltext 1:
| MainDBtabelle.FieldByName('p_a_pkw').AsString := tcheckboxp_a_pkw.text; |
So würde es wohl kaum gehen, habs nicht ausprobiert, aber es gibt ja kein Text zu übernehmen. Es muss geschaut werden ob das Teil abgehackt ist oder nicht und je nachdem eine Ausgabe wie "Ja" oder "Nein" in die Datenbank übernommen werden.
Wüsstest du da vielleicht noch was... ?
|
|
biohazard
      
Beiträge: 89
|
Verfasst: Do 12.06.03 08:42
Da könntest du doch einfach eine Bedingung stellen
z.B.
if checkbox.checked = true then fieldbyname(xxx) := 'ja'
else if checkbox.checked = false then fieldbyname(xxx) := 'nein'
Eigentlich müsste das so funzen.
|
|
LuckyStrike4life 
      
Beiträge: 196
Win 2000, XP, SuSE Linux 8.2
D5 Enterp.
|
Verfasst: Do 12.06.03 09:03
Das hört sich ja sehr richtig an und ist eigentlich auch verständlich, aber so mags noch nicht funktionieren.
Hab natürlich verschiedene Möglichkeiten ausprobiert, aber keine wollten klappen. Mit einen Delphi Kentnissen ist es halt nicht so weit her  .
...
|
|
grayfox
      
Beiträge: 800
win98, winXP
D4 Standard; D6 Personal
|
Verfasst: Do 12.06.03 09:16
hallo lucky!
du kannst DBEdit-Felder ruhig auch zum anzeigen von tabelleninhalten
verwenden - hast es schon mal so versucht?
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:
| unit Mainprog;
interface
uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, DBCtrls, Grids, DBGrids, Db, DBTables, StdCtrls, Mask;
type TForm1 = class(TForm) Table1: TTable; DataSource1: TDataSource; DBGrid1: TDBGrid; DBNavigator1: TDBNavigator; DBEdit1: TDBEdit; DBEdit2: TDBEdit; DBCheckBox1: TDBCheckBox; DBCheckBox2: TDBCheckBox; OpenBtn: TButton; CloseBtn: TButton; EndeBtn: TButton; AppendBtn: TButton; EditBtn: TButton; Label1: TLabel; procedure EndeBtnClick(Sender: TObject); procedure OpenBtnClick(Sender: TObject); procedure CloseBtnClick(Sender: TObject); procedure AppendBtnClick(Sender: TObject); procedure Table1NewRecord(DataSet: TDataSet); procedure EditBtnClick(Sender: TObject); procedure FormShow(Sender: TObject); private editieren: Boolean; public end;
var Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.EndeBtnClick(Sender: TObject); begin close; end;
procedure TForm1.OpenBtnClick(Sender: TObject); begin if not Table1.Active then Table1.Open; end;
procedure TForm1.CloseBtnClick(Sender: TObject); begin Table1.Close; end;
procedure TForm1.AppendBtnClick(Sender: TObject); begin Table1.Append; DBEdit1.SetFocus; end;
procedure TForm1.Table1NewRecord(DataSet: TDataSet); begin with table1 do begin FieldByName('Feld1').asBoolean:= true; FieldByName('Feld2').asBoolean:= false end; end;
procedure TForm1.EditBtnClick(Sender: TObject); begin editieren:= not editieren; datasource1.AutoEdit:= editieren; if editieren then Label1.Caption:= 'Edit on' else Label1.Caption:= 'Edit off'; Label1.Update; end;
procedure TForm1.FormShow(Sender: TObject); begin editieren:= true; end;
end. |
je nach anwenderprofil darf ändern oder darf ansehen schaltest
Datasource1.AutoEdit auf false oder true
mfg, stefan
|
|
biohazard
      
Beiträge: 89
|
Verfasst: Do 12.06.03 09:19
Was genau geht denn nicht (Fehlermeldung).
Steht der Befehl zusammen mit den andere zwischen append und post? Wenn nicht, dann könnte da der Fehler liegen.
Ohne nähere Infos kann ich dir jetzt auch nichts sagen.
|
|
grayfox
      
Beiträge: 800
win98, winXP
D4 Standard; D6 Personal
|
Verfasst: Do 12.06.03 09:31
hi biohazard!
sag ich auch, dass ein bisschen quellcode langsam gar nicht schlecht wäre.
bei der hitze mag ich meine kristallkugel nicht hervorkramen
mfg, stefan
|
|
LuckyStrike4life 
      
Beiträge: 196
Win 2000, XP, SuSE Linux 8.2
D5 Enterp.
|
Verfasst: Do 12.06.03 09:55
Okay okay,
ich hab aber n © auf meinen Code!  Spaß bei Seite, dass Leben ist zu ernst. Du brauchst auch nicht in die Kugel schaun, Gray.
@GrayFox
Nette Idee mit dem Code den du gepostet hast, werde ich mich mal ransetzen. Auch wenn die momentane Lösung überblicklicher ist. Hab mir mal die Zeit genommen und den Code im Kopf kompiliert, müsste funktionieren, werd ich also versuchen sobald ich die Zeit hab. Thx dafür.
@biohazard
Also, mir gings nicht auf, wie ich den Code einfügen soll, ich habs natürlich zwischen append und post versucht, alles andere wäre auch etwas sehr optimistisch.
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: 133: 134: 135: 136: 137: 138: 139: 140: 141: 142: 143: 144: 145: 146: 147: 148: 149: 150: 151: 152: 153: 154: 155: 156: 157: 158: 159: 160: 161: 162: 163: 164: 165: 166: 167: 168: 169:
| unit DB4realpas;
interface
uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, Grids, DBGrids, StdCtrls, Mask, DBCtrls, Db, DBTables, ExtCtrls, Menus, QuickRpt, Qrctrls, QRPrntr, Buttons, ComCtrls;
type TForm1 = class(TForm) MainDBDataSource: TDataSource; MainDBtabelle: TTable; MainDBGrid: TDBGrid; MainMenu1: TMainMenu; Datei1: TMenuItem; Beenden1: TMenuItem; PanelHEingabe: TPanel; AllgAngaben: TGroupBox; Zweck: TDBMemo; Label7: TLabel; Label8: TLabel; Label9: TLabel; Label10: TLabel; Label11: TLabel; Label12: TLabel; quickstartpanel: TPanel; AutosTabelle: TTable; Kraftfahrzeuge1: TMenuItem; Hilfe2: TMenuItem; Info2: TMenuItem; N2: TMenuItem; Hilfe3: TMenuItem; Kraftfahrzeugverwaltung1: TMenuItem; Drucken1: TMenuItem; GroupBox1: TGroupBox; DLaufz: TDBMemo; DDatum: TDBMemo; DBMemo1: TDBMemo; DBMemo2: TDBMemo; DBMemo3: TDBMemo; DBMemo4: TDBMemo; DBEdit2: TDBEdit; Label15: TLabel; Label16: TLabel; Label17: TLabel; Label18: TLabel; Label19: TLabel; Label20: TLabel; Label21: TLabel; Label22: TLabel; Label24: TLabel; Label23: TLabel; Label25: TLabel; Label26: TLabel; Label27: TLabel; Label28: TLabel; Label29: TLabel; Label30: TLabel; DBEdit4: TDBEdit; DBEdit5: TDBEdit; DBEdit6: TDBEdit; DBMemo5: TDBMemo; AutoDataSource: TDataSource; Button1: TButton; SpeedButton1: TSpeedButton; SpeedButton2: TSpeedButton; SpeedButton3: TSpeedButton; SpeedButton4: TSpeedButton; SpeedButton5: TSpeedButton; SpeedButton6: TSpeedButton; DBNavigator1: TDBNavigator; Reisemittel: TGroupBox; Label1: TLabel; Label2: TLabel; Label3: TLabel; Label4: TLabel; Label5: TLabel; Label6: TLabel; Label13: TLabel; Label14: TLabel; DBLookupComboBox1: TDBLookupComboBox; Button2: TButton; Datum: TEdit; Name: TEdit; Laufzeichen: TEdit; Beginn: TEdit; Ende: TEdit; CheckBox1: TCheckBox; CheckBox2: TCheckBox; DBCheckBox1: TDBCheckBox; procedure Beenden1Click(Sender: TObject); procedure Kraftfahrzeugverwaltung1Click(Sender: TObject); procedure Info2Click(Sender: TObject); procedure Drucken1Click(Sender: TObject); procedure Button1Click(Sender: TObject); procedure SpeedButton1Click(Sender: TObject); procedure SpeedButton2Click(Sender: TObject); procedure Button2Click(Sender: TObject); private public end;
var Form1: TForm1;
implementation
uses VdKraftfahrzeuge, Infopas, Druckenpas;
{$R *.DFM}
procedure TForm1.Beenden1Click(Sender: TObject); begin Application.Terminate; end;
procedure TForm1.Kraftfahrzeugverwaltung1Click(Sender: TObject); begin Kraftfahrzeugverwaltung.Show; end;
procedure TForm1.Info2Click(Sender: TObject); begin
Info.ShowModal;
end;
procedure TForm1.Drucken1Click(Sender: TObject); begin drucken.show end;
procedure TForm1.Button1Click(Sender: TObject); begin MainDBtabelle.first; end;
procedure TForm1.SpeedButton1Click(Sender: TObject); begin MainDBtabelle.Edit; end;
procedure TForm1.SpeedButton2Click(Sender: TObject); begin MainDBtabelle.refresh; end;
procedure TForm1.Button2Click(Sender: TObject); begin
MainDBtabelle.Append; MainDBtabelle.FieldByName('DATUM').AsString := Datum.text; MainDBtabelle.FieldByName('NAME').AsString := Name.text; MainDBtabelle.FieldByName('LAUFZ').AsString := Laufzeichen.text; MainDBtabelle.FieldByName('BEGINN').AsString := Beginn.text; MainDBtabelle.FieldByName('ENDE').AsString := Ende.text;
MainDBtabelle.Post;
end;
end. |
Das ist der ganze Code des Hauptforms, wo sich das hier besprochene auch abspielt. Vorallem das Ende ist interessant, aber auch noch nicht vollständig.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16:
| procedure TForm1.Button2Click(Sender: TObject); begin
MainDBtabelle.Append; MainDBtabelle.FieldByName('DATUM').AsString := Datum.text; MainDBtabelle.FieldByName('NAME').AsString := Name.text; MainDBtabelle.FieldByName('LAUFZ').AsString := Laufzeichen.text; MainDBtabelle.FieldByName('BEGINN').AsString := Beginn.text; MainDBtabelle.FieldByName('ENDE').AsString := Ende.text;
if checkbox1.checked = true then FieldByName('p_pkw') := 'ja' else if checkbox1.checked = false then FieldByName('p_pkw') := 'nein'
MainDBtabelle.Post;
end; |
Das ist das Wichtige für das momentane Problem, eben auch Checkboxen per If/Else Abfrage in die Datenbank aufzunehmen.
_________________ ... ich kann doch nichts ...
|
|
biohazard
      
Beiträge: 89
|
Verfasst: Do 12.06.03 10:24
Eigentlich hättest du das auch selber sehen können.
Wenn du auf ein Feld einer Tabelle zugreifst, mußt du auch die Tabelle angeben.
Bei den anderen Feldern hast du das gemacht (schau mal was vor fieldbyname steht).
Das von mir war doch nur so ein kurzes Beispiel. Hab mir nicht extra die Mühe gemacht den Quelltext zu schreiben. War mehr so ne Schreibtischvorlage.
Bei dem Wetter wird man aber auch dazu gezwungen alles etwas lockerer anzgehen. 
|
|
LuckyStrike4life 
      
Beiträge: 196
Win 2000, XP, SuSE Linux 8.2
D5 Enterp.
|
Verfasst: Do 12.06.03 10:44
Ob du mir das nun glaubst oder nicht, ich hatte es auch wirklich gleich beim ersten mal mit den Angaben der jeweiligen Tabelle gemacht.
Allerdings brachte mich das auch nicht weiter ... . Ich muss da noch so n Fehler drin haben.
Delphi-Quelltext 1: 2:
| if checkbox1.checked = true then MainDBtabelle.FieldByName('p_pkw') := 'ja' else if checkbox1.checked = false then MainDBtabelle.FieldByName('p_pkw') := 'nein' |
Denn so geht es eben auch nicht, dann sagt Delphi
| Delphi5 hat folgendes geschrieben: |
X [Fehler] DB4realpas.pas(164): Der linken Seite kann nichts zugewiesen werden
X [Fehler] DB4realpas.pas(165): Inkompatible Typen: 'TField' und 'String'
X[Fehler] DB4realpas.pas(165): Der linken Seite kann nichts zugewiesen werden
X[Fehler] DB4realpas.pas(168): Inkompatible Typen: 'TField' und 'String'
X[Fataler Fehler] DB4realdpr.dpr( : Verwendete Unit 'DB4realpas.pas' kann nicht compiliert werden
|
Den ersten Fehler meint Delphi nach dem ersten '=' Zeichen zu sehen.
_________________ ... ich kann doch nichts ...
|
|
biohazard
      
Beiträge: 89
|
Verfasst: Do 12.06.03 10:58
Sorry, da hab ich wohl was überssehen. Hinter das fieldbyname muß natürlich noch der Wertebereich (.asString) - so wie bei den anderen auch.
table1.fieldbyname('xxx').asString ... usw.
Naja, bei dem Wetter ist es aber auch schwer sich mit Denken zu befassen. 
|
|
LuckyStrike4life 
      
Beiträge: 196
Win 2000, XP, SuSE Linux 8.2
D5 Enterp.
|
Verfasst: Do 12.06.03 11:20
Juhuu es geht!
Vielen Dank! Endlich komme ich dem ganzen ein Stück näher.
Thx 2 biohazard & grayfox.
Wir werden noch viel von einander hören, wenn ihr mögt  .
_________________ ... ich kann doch nichts ...
|
|
|