| Autor |
Beitrag |
carstenas
Hält's aus hier
Beiträge: 6
|
Verfasst: Mo 04.10.10 08:51
Hallo
Ich versuche eine nicht DB Komponente(TNextGrid) an meine Datenbank anzubinden,
es war mir möglich nach langem suchen in büchern und foren die einzelenen Datenfelder einzulesen,
die DBKomponente TDBNextgrid gibt es zwar,kann ich mir aber nicht leisten.
muß also mit diesem Grid versuchen,dieses Grid gefällt mir sehr gut da gibt es diesen Prozessbalken,und die Footer Zeile.
mein ziel ich möchte einfach wenn ich auf das Grid Klicke den DS wechseln.
meine Frage ist es viel aufwand das Grid (habe keinen Source)an meine datasource anzubinden.Wenn ja welche befehle werden dafür benötigt.
Bin Delphi Anfänger,mache learning by doing.
Gruß
|
|
Tranx
      
Beiträge: 648
Erhaltene Danke: 85
WIN 2000, WIN XP
D5 Prof
|
Verfasst: Mo 04.10.10 11:06
Ich vermute, Du hast keine Professional oder Enterprise-Version.
Dann denke ich, wird es schwierig mit der Datenbankanbindung. Kannst Du überhaupt Datenbanken ansprechen (Öffnen, schließen etc.)?
Wenn ja, dann frage ich mich, wieso die TDB-Komponente nicht existiert.
Leider habe ich eine zu alte Delphi-Version, kann mit der Komponente TNextStringgrid nichts anfangen.
Solltest Du jedoch z.B. TDBGrid haben, dann schaue doch mal in dem Quelltext der DBGRIDS.PAS und GRIDS.PAS (STRINGGRID) nach, welche Unterschiede es gibt. Und dann kannst Du Dich ja an die Komponente TDBNextGrid wagen, indem Du die Datenbankenkomponenten zu TNextGrid einfach hinzufügst.
So habe ich es auch mit TDBDateTimePicker gemacht. Kannst Du ja mal nachsehen, was da ist. Ich habe es hier veröffentlicht.
Aber wie gesagt, das geht nur, wenn Du mit Deiner Delphi-Version auch Datenbanken ansprechen kannst.
|
|
carstenas 
Hält's aus hier
Beiträge: 6
|
Verfasst: Mo 04.10.10 11:32
Hallo
Doch ich kann Datenbanken ansprechen,das TNextString ist eine Fremdkomponente,ich kann an dem TNextstring keine Änderung vornehmen,wie gesagt eine Fremdkomponente.Es könnte dann wenn überhaupt nur zur Laufzeit geändert werden.Dass ist ja die Frage kann man überhaupt zur Laufzeit an einer Komponente was Ändern wie zb Datenbankanbindung.
Ich kann mit dem Grid alles anstellen Zellen füllen aus einer Datenbank usw.Mir fehlt eben nur die anbindung,an das Dataset oder Datasource.Die frage kann mir eben nur einer beantworten der Komponenten entwickelt und davon bin ich weit weg.(Anfänger Status).
|
|
Sinspin
      
Beiträge: 1336
Erhaltene Danke: 119
Win 10
RIO, CE, Lazarus
|
Verfasst: Mo 04.10.10 11:50
Hallo und  in der EE!
es ist immer möglich eine non-DB Komponente an eine Datenbank "zu hängen", die Frage ist wie tief man gehen will (muss). Ich habe mal überflogen um was es sich bei TNextGrid handelt.
Was für eine Delphi Version hast du und was für eine Version von TNextGrid, sicher die Free für D6 oder D7, verwendest du?
Du kannst also auf deine DB-Tabelle zugreifen? Du kannst doch auch auf die Felder in TNextGrid zugreifen? Also kannst du doch auch einfach die Feldwerte (Inhalte) aus deiner DB-Tabelle in den TNextGrid schreiben. Ist zwar doppelte Datenhaltung, geht aber an der Stelle erstmal nicht anders.
Als nächstes brauchst du also noch die Bindung für ändern von Daten. Dafür müssen als erstes die Ereignisse des TNextGrid herhalten. Dort musst du reagieren wenn eine bearbeitete Zelle im TNextGrid gespeichert wird, dann kannst du den Wert auch in das passende Feld deiner DB-Tabelle schreiben.
@ Tranx
Bitte, bitte, lies in Zukunft die Posts der Fragesteller aufmerksam durch bevor du antwortest. Denn leider ist deine Antowrt nicht wirklich passend.
_________________ Wir zerstören die Natur und Wälder der Erde. Wir töten wilde Tiere für Trophäen. Wir produzieren Lebewesen als Massenware um sie nach wenigen Monaten zu töten. Warum sollte unser aller Mutter, die Natur, nicht die gleichen Rechte haben?
|
|
JoelH
      
Beiträge: 806
Erhaltene Danke: 17
Win10
Delphi Alexandria 11.2 Patch 1
|
Verfasst: Mo 04.10.10 11:51
ohne die Komponente jetzt zu kenne gehe ich mal davon aus, dass du die Tabelle "mit der Hand" füllen musst, wenn es keine DB-Komponente ist. Da du schreibst, dass es auch eine entsprechende DB-Komponente gibt, wirds die nicht ihne Grund geben 
_________________ mfg. Joel
|
|
carstenas 
Hält's aus hier
Beiträge: 6
|
Verfasst: Mo 04.10.10 12:41
Hallo Sinspin + JoelH
Komponente:=TNextGrid 3.2.1 Freeware
Umgebung:=D7
Datenbank:=ABSDatabase ver 6,07
Also ich verstehe einige dinge nicht wirklich,du schreibst ich soll daten in das Grid schreiben?oder meinst du nur anzeigen? Anzeigen kann ich sie aus der DB aber wie soll ich daten in das Grid schreiben und speichern so dass eine Doppelte Datenhaltung zustande kommt?
Der eingriff scheint ziemlich umfangreich zu werden ich möchte ja auch nicht unbedingt in dass Grid schreiben es sollte nur zum anzeigen dienen,aber wenn ich die entsprechende zeile anklicke möchte ich in der DB auf den entsprechenden Record setzen.
So dass ich die Datenbankfelder DBEdit bearbeiten kann danach lese ich die Aktualisierte DB wieder ins Grid.
Sicherlich gibt es eine TDBNext Grid Komponente,ich habe durch zufall die version 3.21 gefunden, aber ohne DB anbindung und dachte man kann mit wenigen befehlen evtl das Grid an die DB anhängen.
JoelH:Ich komme mit dem Begriff Tabelle durcheinander meinst du DB als Tabelle oder Grid als Tabelle?meine DB(tabelle) muß ich schon von hand füllen woher sollen sonst die Daten kommen!
|
|
Tranx
      
Beiträge: 648
Erhaltene Danke: 85
WIN 2000, WIN XP
D5 Prof
|
Verfasst: Mo 04.10.10 13:01
Da Du schreibst, es ist eine Fremdkomponente - es liegt also kein Quellcode vor - dann gehe doch genauso vor, wie es bei TStringgrid <-> TDBGrid geschieht. Da sind einige zusätzliche Routinen, wie Datenbankaufrufe, und zusätzliche Variablen, wie Datasource, ... die müssen bei TDNextgrid auch eingebunden werden. Schaue Dir dessen Quellcode an (Grids.pas bzw. DBGrids.pas. Die Unterschiede sind die Datenbankanbindungs-Implementierungsroutinen.
Dann machst Du es wie folgt: Neue Komponente auswählen, dann Schreibst Du:
TDBNextGrid = Class(TNextGrid)
hier die notwendigen Routinen
private
hier notwendige Variablen
end;
dann gehst Du nach "Komponente installieren" und wenn alle Fehler beseitigt sind, sollten die zusätzlichen Felder und Routinen implementiert sein und Du kannst die selbst erstellte Komponente nutzen. Nicht vergessen, die Unit, in der TNextGrid implementiert wurde, in die Unit für TDBNextGrid einzubinden.
|
|
Tranx
      
Beiträge: 648
Erhaltene Danke: 85
WIN 2000, WIN XP
D5 Prof
|
Verfasst: Mo 04.10.10 13:09
@simspin:
Das denke ich nicht, dass ich da geschlafen habe. Ich bin bei der Erzeugung der Komponente TDBDateTimePicker exakt so vorgegangen und es hat geklappt. Dazu benötigt man nicht den Quellcode von der Ursprungskomponente, man muss nur wissen, wie man Datenbankkomponenten in die neue Komponenten implementiert. Und dazu ist es hilfreich, zu sehen, wie es bei anderen - ähnlichen Komponenten passiert. Dann klappt das auch, ohne dass man eine teure Komponente kauft. Und der Quellcode der Vergleichskomponente kann einfach kopiert werden. Das ist das Gute daran. Man muss dann nur noch den unnützen Ballast entfernen - und natürlich die zig Fehler, die dabei notwendigerweise auftreten werden - und dann läuft die Sache.
Ist nur Fleißarbeit. Und ich weiß, wovon ich rede, denn ich bin kein Profiprogrammierer.
|
|
carstenas 
Hält's aus hier
Beiträge: 6
|
Verfasst: Mo 04.10.10 13:24
Hallo Tranx
Diesen gedanken hatte ich auch vorher,aber wie gesagt dass wäre ein erstellen von einer neuen Komponente und damit bin ich noch weit überfordert,mein Status(Anfänger),vielleicht komme ich noch dazu sowas mal zu Programmieren!
Danke
|
|
Tranx
      
Beiträge: 648
Erhaltene Danke: 85
WIN 2000, WIN XP
D5 Prof
|
Verfasst: Mo 04.10.10 13:27
Konkret:
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: 170: 171: 172: 173: 174: 175: 176: 177: 178: 179: 180: 181: 182: 183: 184: 185: 186: 187: 188: 189: 190: 191: 192: 193: 194: 195: 196: 197: 198: 199: 200: 201: 202: 203: 204: 205: 206: 207: 208: 209: 210: 211: 212: 213: 214: 215: 216: 217: 218: 219: 220: 221: 222: 223: 224: 225: 226: 227: 228: 229: 230: 231: 232: 233: 234: 235: 236: 237: 238: 239: 240: 241: 242: 243: 244: 245: 246: 247: 248: 249: 250: 251: 252: 253: 254: 255: 256: 257: 258: 259: 260: 261: 262: 263: 264: 265: 266: 267: 268: 269: 270: 271: 272: 273: 274: 275: 276: 277: 278: 279: 280: 281:
| unit DBNextGrid;
interface
uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, ComCtrls, DB, DBTables, DBCtrls; type
TDBNextGrid = class(TNextGrid) private FDataLink: TFieldDataLink; FPaintControl: TPaintControl;
procedure DataChange(Sender: TObject); function GetDataField: string; function GetDataSource: TDataSource; function GetField: TField; function GetReadOnly: Boolean; procedure SetDataField(const Value: string); procedure SetDataSource(Value: TDataSource); procedure SetReadOnly(Value: Boolean); procedure UpdateData(Sender: TObject); procedure CMGetDataLink(var Message: TMessage); message CM_GETDATALINK; protected procedure Change; override; procedure Loaded; override; procedure Click; override; procedure Notification(AComponent: TComponent; Operation: TOperation); override; procedure WndProc(var Message: TMessage); override; public constructor Create(AOwner: TComponent); override; destructor Destroy; override; function ExecuteAction(Action: TBasicAction): Boolean; override; function UpdateAction(Action: TBasicAction): Boolean; override; function UseRightToLeftAlignment: Boolean; override; property Field: TField read GetField; published property Anchors; property BiDiMode; property Color; property Constraints; property Ctl3D; property DataField: string read GetDataField write SetDataField; property DataSource: TDataSource read GetDataSource write SetDataSource; property DragCursor; property DragKind; property DragMode; property Enabled; property Font; property ImeMode; property ImeName; property ParentBiDiMode; property ParentColor; property ParentCtl3D; property ParentFont; property ParentShowHint; property PopupMenu; property ReadOnly: Boolean read GetReadOnly write SetReadOnly default False; property ShowHint; property TabOrder; property TabStop; property Visible; property OnChange; property OnClick; property OnContextPopup; property OnDblClick; property OnDragDrop; property OnDragOver; property OnDropDown; property OnEndDock; property OnEndDrag; property OnEnter; property OnExit; property OnKeyDown; property OnKeyPress; property OnKeyUp; property OnStartDock; property OnStartDrag; end;
procedure Register;
implementation
constructor TDBNextGrid.Create(AOwner: TComponent); begin inherited Create(AOwner); ControlStyle := ControlStyle + [csReplicatable]; FDataLink := TFieldDataLink.Create; FDataLink.Control := Self; FDataLink.OnDataChange := DataChange; FDataLink.OnUpdateData := UpdateData; FPaintControl := TPaintControl.Create(Self, 'COMBOBOX'); end;
destructor TDBNextGrid.Destroy; begin FPaintControl.Free; FDataLink.Free; FDataLink := nil; inherited Destroy; end;
procedure TDBNextGrid.Loaded; begin inherited Loaded; if (csDesigning in ComponentState) then DataChange(Self); end;
procedure TDBNextGrid.Notification(AComponent: TComponent; Operation: TOperation); begin inherited Notification(AComponent, Operation); if (Operation = opRemove) and (FDataLink <> nil) and (AComponent = DataSource) then DataSource := nil; end;
procedure TDBNexstGrid.DataChange(Sender: TObject); begin if DroppedDown then Exit; if FDataLink.Field <> nil then begin
Self.Visible := not (FDataLink.Field.AsString = ''); DateTime := FDataLink.Field.asDateTime; end else begin if csDesigning in ComponentState then DateTime := Date; end; end;
procedure TDBNextGrid.UpdateData(Sender: TObject); begin FDataLink.Field.asDateTime := DateTime; end;
procedure TDBNextGrid.Change; begin FDataLink.Edit; inherited Change; FDataLink.Modified; WinActualize; end;
procedure TDBNextGrid.Click; begin FDataLink.Edit; inherited Click; FDataLink.Modified; end;
function TDBNextGrid.GetDataSource: TDataSource; begin Result := FDataLink.DataSource; end;
procedure TDBNextGrid.SetDataSource(Value: TDataSource); begin if not (FDataLink.DataSourceFixed and (csLoading in ComponentState)) then FDataLink.DataSource := Value; if Value <> nil then Value.FreeNotification(Self); end;
function TDBNextGrid.GetDataField: string; begin Result := FDataLink.FieldName; end;
procedure TDBNextGrid.SetDataField(const Value: string); begin FDataLink.FieldName := Value; WinActualize; end;
function TDBNextGrid.GetReadOnly: Boolean; begin Result := FDataLink.ReadOnly; end;
procedure TDBNextGrid.SetReadOnly(Value: Boolean); begin FDataLink.ReadOnly := Value; end;
function TDBNextGrid.GetField: TField; begin Result := FDataLink.Field; end;
procedure TDBNextGrid.KeyDown(var Key: Word; Shift: TShiftState); begin inherited KeyDown(Key, Shift); end;
procedure TDBNextGrid.KeyPress(var Key: Char); begin if (Key in [#32..#255]) and (FDataLink.Field <> nil) and not FDataLink.Field.IsValidChar(Key) then begin MessageBeep(0); Key := #0; end; case Key of
^H, ^V, ^X, #32..#42, #44, #46..#255: FDataLink.Edit; #27: begin FDataLink.Reset; end; end; inherited KeyPress(Key); end;
procedure TDBNextGrid.WndProc(var Message: TMessage); begin if not (csDesigning in ComponentState) then case Message.Msg of WM_COMMAND: if TWMCommand(Message).NotifyCode = CBN_SELCHANGE then if not FDataLink.Edit then begin Exit; end; CB_SHOWDROPDOWN: if Message.WParam <> 0 then FDataLink.Edit else if not FDataLink.Editing then DataChange(Self); WM_CREATE, WM_WINDOWPOSCHANGED, CM_FONTCHANGED: FPaintControl.DestroyHandle; end; inherited WndProc(Message); end;
function TDBNextGrid.UseRightToLeftAlignment: Boolean; begin Result := DBUseRightToLeftAlignment(Self, Field); end;
procedure TDBNextGrid.CMGetDatalink(var Message: TMessage); begin Message.Result := Integer(FDataLink); end;
function TDBNextGrid.ExecuteAction(Action: TBasicAction): Boolean; begin Result := inherited ExecuteAction(Action) or (FDataLink <> nil) and FDataLink.ExecuteAction(Action); end;
function TDBNextGrid.UpdateAction(Action: TBasicAction): Boolean; begin Result := inherited UpdateAction(Action) or (FDataLink <> nil) and FDataLink.UpdateAction(Action); end;
procedure Register; begin
RegisterComponents('Beispiele', [TDBNextGrid]); end;
end. |
Probier das mal!!! Ich habe es aus meiner Komponente erzeugt, daher kann ich leider für Fehlerfreiheit nicht garantieren. Für Fragen stehe ich gerne zur Verfügung.
Vielleicht klappt es gleich zu Anfang. Wie gesagt, mit "Komponente instalolieren diese Komponente in Delphi einbinden. Geschieht durch die Prozedur Register, dann erscheint die Komponente in dem Blatt "Beispiele" und Du kannst sie - falls erfolgreich kompiliert - nutzen.
|
|
carstenas 
Hält's aus hier
Beiträge: 6
|
Verfasst: Mo 04.10.10 13:44
Tranx
Du gibst dir ganz schön mühe!!!dafür bin ich echt dankbar aber dass muß ich erst mal verarbeiten,ich werde dass auf jedenfall probieren auch wenn es jetzt nicht gleich klappt Feedback kommt sicher!
Danke
|
|
Tranx
      
Beiträge: 648
Erhaltene Danke: 85
WIN 2000, WIN XP
D5 Prof
|
Verfasst: Mo 04.10.10 13:58
Kein Problem,
aber - wie gesagt, ich habe nur meine Komponente umgeschrieben. Das müsste funktionieren, aber falls nicht, nicht gleich aufgeben. Ich habe auch etwas gebraucht, bis es bei mir funktionierte.
Gern geschehen.
|
|
carstenas 
Hält's aus hier
Beiträge: 6
|
Verfasst: Sa 20.11.10 19:13
Hallo Tranx
Ich habe deinen Code versucht umzusetzten mir ist es nicht gelungen,es ist mir nicht möglich gewesen was zu erstellen,werde es zu einem späteren zeitpunkt wieder versuchen wenn meine Delphi Kentnisse gewachsen sind.
Danke für die Hilfe.
Gruß Carsten
|
|
|