![]() |
Re: Anzeigeproblem bei eigener DB-Text-Komponente auf DBCtrl
Hab eine Idee - muss aber schnell machen, meine Kollegin scheucht mich von Ihrem Rechner weg :-((
DBCtrlGrid missbraucht ja irgendwie die eingebundenen DB-Kompos und zwingt denen die Anzeige auf (anhand der Datensätze SEINES Datenpuffers). Ein normals DBLabel würde ja z.B. immer nur die Anzeige des AKTUELLEN Datensatzes ermöglichen. Deine Kompo müsste daher vermutlich so kompotibel gemacht werden, dass sie sich, wenn sie in einem DBCtrlGrid plaziert ist, die Datenmengenwerte aus dessen Datenpuffer bezieht... Soviel erst mal bis zum Feierabend... Stahli |
Re: Anzeigeproblem bei eigener DB-Text-Komponente auf DBCtrl
Hallo Marabu,
das mit der Usese Klausel könnte natürlich von den Delphi-Versionen variieren. Bei mir startete er meine, aber das würde das anneinander Vorbeireden erklären, denn Du hattest wahrscheinlich die funktionierende Orginal-DB-Kompo auf Deinem DBCtrlGrid. Ich sollte die Komponente umbenennen. Das Bild Problem kommt dann natürlich auch bei Dir zum vorschein. Hallo Stahli, denke da muß der Pfad irgendwo liegen... Viele Grüße // Martin |
Re: Anzeigeproblem bei eigener DB-Text-Komponente auf DBCtrl
Moin, moin,
nach einigem Überlegen habe ich folgend meine Quelle zu "DataLink" hervorgekramt! Allerdings, wie Hansa schon angedeutet hat, gibt es da nicht überaus viel im (W)Internet: ![]() Und kommentiert ist das von Hersusgeber John M. Miano folgend: Zitat:
findet sich dann doch noch ein MilkyWay mit Infos. :wink: Viele Grüße // Martin |
Re: Anzeigeproblem bei eigener DB-Text-Komponente auf DBCtrl
Zitat:
|
Re: Anzeigeproblem bei eigener DB-Text-Komponente auf DBCtrl
Da dürfte Hansa recht haben.
Wenn man nicht wesentliche Datenbankfunktionen verändern möchte sondern eher sonstige Eigenschaften von Komponenten, ist es wohl weniger Aufwand, die Änderungen in der normalen und der Datenbankkomponente zu überschreiben, als sämtliche Datenbankfunktionen neu zu entwickeln. Man kann ja die eigentlichen Funktionen dafür in einer eigenen Unit auslagern und von TMyColorMemo und TMyDBColorMemo aus gleichermaßen nutzen... (wenn ich das nicht wieder falsch verstanden habe) Stahli |
Re: Anzeigeproblem bei eigener DB-Text-Komponente auf DBCtrl
Ja meine Ausdrucksweise war etwas knapp "abgeleitete Klasse" für Overlayclass.
Der Ansatz ist gerade unterschiedliche Klasssen dadurch DB-fähig zu machen, in dem die zuletzt abgeleitete Klasse den DB-Zugriff steuert. Man hat prinzipiell zwei Wege DB-Klasse in der Mitte und alle weiterführenden Klassen darauf aufstezten oder alle Klassen unter der DB-Klasse. Bei letzterem kann ich eine nicht DB-Komponente erweitern und die zugehörige DB-Komponente hat nach dem Package compilieren die gleichen eigenschaften. Wenn man es einmal aufgebaut hat, ist es nachher deutlich leichter, da man sich nicht unterschiedliche Properties von DB und nicht DB-Klassen (bis auf den Link) merken muß. Hoffe ja, dass vielleicht doch noch jemand einen weiteren Gedanken zu der DBCtrlGrid Sache hat, dann wäre das Verfahren durchgängig gelöst. Viele Grüße // Martin |
Re: Anzeigeproblem bei eigener DB-Text-Komponente auf DBCtrl
Zitat:
|
Re: Anzeigeproblem bei eigener DB-Text-Komponente auf DBCtrl
Well, moin,
inzwischen bin ich soweit, dass ich mit einer DataLinkListe experimentiere. Offensichtlich brauchet jedes Element auf dem DBCtrlGrid Panel seinen eigenen Datenspeicher. Wie stahli schon vermutete wird jedes Element gezeichnet, aber auf den nicht aktuellen Panels landed ein Leerstring. Soweit zunächst. Viele Grüße // Martin |
Re: Anzeigeproblem bei eigener DB-Text-Komponente auf DBCtrl
Hallo Martin,
also meine Komponenten funktionieren in DBCtrlGrid gar nicht (müssen sie aber auch nicht). DBEditSql (abgeleitet von DBEdit) lässt sich nicht einmal in das Grid einbinden. Das Grid übernimmt offenbar die Kontrolle über die eingebunden Kompos, ordnet denen seine eigene interne Datenmenge zu und gibt möglicherweise sogar vor, wann diese Kompos neue Dateninhalte anzeigen sollen (sonst würden sie möglicherweise alle den Inhalt des aktuellen Datensatzes anzeigen). Wenn das so ist, muss das Grid aber die eingebunden Komponenten kennen, um diese für seine Zwecke umzubiegen... Mit dem FieldDataLink musst Du Dich m.E. nur näher beschäftigen, wenn Du mehrere Datensätze in Deiner Komponente verwalten willst (wie ein DBGrid). Ansonsten reicht es, einfach nur FieldDataLink einzubinden. So habe ich es für meine Ein-Datensatz-Komponente gemacht:
Delphi-Quellcode:
//
constructor TDBSqlCustom.Create(AOwner: TComponent); begin inherited; FFieldDataLink:=TFieldDataLink.Create; FieldDataLink.Control:=Self; FieldDataLink.OnDataChange:=DataChange; ... // procedure TDBSqlCustom.SetDataSet(Value:TDataSet); begin if ((FieldDataLink<>nil) and (FieldDataLink.DataSource<>nil)) then begin if (Value<>FieldDataLink.DataSource.DataSet) then begin FieldDataLink.DataSource.DataSet:=Value; ShowData(True); // Datensatzinhalt anzeigen end; end; ... procedure TDBSqlCustom.SetFieldName(Value:String); begin if (FFieldName<>Value) then begin FField:=nil; FFieldName:=Value; FFieldDataLink.FieldName:=FFieldName; ShowData(True); ... procedure TDBSqlCustom.SetDataSource(Value:TDataSource); begin if ((FFieldDataLink<>nil) and (FFieldDataLink.DataSource<>Value)) then begin ResetFields(True); FFieldDataLink.DataSource:=nil; FFieldDataLink.FieldName:=''; if (not (FFieldDataLink.DataSourceFixed and (csLoading in ComponentState))) then FFieldDataLink.DataSource:=Value; if (Value<>nil) then Value.FreeNotification(Self); ShowData(True); ... Für mehrere Datensätze habe ich einen ausreichend großen Puffer für die anzuzeigenden Datensätze angelegt: FieldDataLinkShow.BufferCount:=100; (wobei ich mehrere Datenmenge syncronisiere und deshalb die Puffergrößen aufeinander abstimmen muss) Mit FieldDataLinkShow.ActiveRecord:=FieldDataLinkShow. ActiveRecord+-1 kannst Du durch die Datensätze iterieren, ohne dass dies Auswirkungen auf angebundene datensensitive Komponenten hat. Wenn Du außerhalb des definierten Pufferbereiches kommst, erhältst Du nur noch leere Dateninhalte. TDBSqlWhere kapselt die ganze Datenbankverbindung und wird von meinen TDBTabControlSql und TDBPanelsSql jeweils benutzt, um "die jeweils nächsten" Datensätze bereitzustellen. Die beiden Komponenten wiederum geben Ihrerseits vor, wann die Dateninhalte der einzelnen Items gezeichnet werden müssen:
Delphi-Quellcode:
Das sind zwar etwas ältere Quelltexte, das Prinzip sollte aber erkennbar sein...
//------------------------------------------------------------------------------
// procedure TDBSqlWhere.SetDBSqlBufferCount(MaxCount:Integer); var NeedBufferCount:Integer; begin if (MaxCount=0) then MaxCount:=MinBufferCount; if ((MaxCount>0) and (RecordCount>0)) then NeedBufferCount:=Min(RecordCount,MaxCount) else NeedBufferCount:=RecordCount; DBSqlBufferSize:=Max(DBSqlBufferSize,NeedBufferCount); if (FieldDataLinkShow.BufferCount<DBSqlBufferSize) then FieldDataLinkShow.BufferCount:=DBSqlBufferSize; end; //------------------------------------------------------------------------------ // procedure TDBSqlWhere.BeginReadRecord(RR:Integer=-1); begin if (RR>0) then FieldDataLinkShow.ActiveRecord:=RR; if (FieldDataLinkShow<>nil) then begin ActiveDBSqlRecNo:=DataSetShow.RecNo; ActiveDBSqlRecord:=FieldDataLinkShow.ActiveRecord; end else begin ActiveDBSqlRecNo:=0; ActiveDBSqlRecord:=0; end; FirstDBSqlRecNo:=ActiveDBSqlRecNo; LastDBSqlRecNo:=ActiveDBSqlRecNo; ReadDBSqlRecNo:=ActiveDBSqlRecNo; FirstDBSqlRecord:=ActiveDBSqlRecord; LastDBSqlRecord:=ActiveDBSqlRecord; ReadDBSqlRecord:=ActiveDBSqlRecord; end; //------------------------------------------------------------------------------ // function TDBSqlWhere.GetReadRecord(RR:Integer):Boolean; begin Result:=False; if ((RR>=0) and (RR<RecordCount)) then begin if ((RR<FirstDBSqlRecord) or (FirstDBSqlRecord<0)) then FirstDBSqlRecord:=RR; if (RR>LastDBSqlRecord) then LastDBSqlRecord:=RR; FieldDataLinkShow.ActiveRecord:=RR; Result:=True; end; end; //------------------------------------------------------------------------------ // function TDBSqlWhere.ReadRecordIsActive:Boolean; begin Result:=(FieldDataLinkShow.ActiveRecord=ActiveDBSqlRecord); end; //------------------------------------------------------------------------------ // procedure TDBSqlWhere.GoToRecNo(RN:Integer); begin inherited; if (DataSetShow<>nil) then begin if (RN>RecordCount) then RN:=RecordCount; if (RN>0) then DataSetShow.RecNo:=RN; end; end; //------------------------------------------------------------------------------ // procedure TDBSqlWhere.EndReadRecord; begin if (FieldDataLinkShow<>nil) then FieldDataLinkShow.ActiveRecord:=ActiveDBSqlRecord; end; Gruß Stahli |
Re: Anzeigeproblem bei eigener DB-Text-Komponente auf DBCtrl
Moin, moin,
Marabu hat recht! :wink: Die Komponente wird nicht korrekt angezeigt,weil Sie dynamisch erzeugt wird. Irgenwo habe ich vergessen diese im Grid zu registrieren. Da liege ich oben auch falsch! Wie kannich den jetzt herausbekommen,was das Grid macht, wenn die Komponente darauf abgelegt wird :?: Muß am Wochenende nochmal etwas mehr lesen... Grüße // Martin PS Da hat die JVcl doch auch ähnliche Probleme ![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:37 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz