Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Anzeigeproblem bei eigener DB-Text-Komponente auf DBCtrlGrid (https://www.delphipraxis.net/85041-anzeigeproblem-bei-eigener-db-text-komponente-auf-dbctrlgrid.html)

stahli 25. Jan 2007 13:01

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

mschaefer 25. Jan 2007 13:05

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

mschaefer 25. Jan 2007 15:36

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:

The Unofficial Delphi Component Writing FAQ

Und kommentiert ist das von Hersusgeber John M. Miano folgend:
Zitat:

As far as I can tell the only documentation for TDataLink that exists in the
entire universe is what follows
Das Univers dreht sich aber weiter und vielleicht
findet sich dann doch noch ein MilkyWay mit Infos. :wink:


Viele Grüße // Martin

Hansa 25. Jan 2007 15:46

Re: Anzeigeproblem bei eigener DB-Text-Komponente auf DBCtrl
 
Zitat:

Zitat von mschaefer
z.B. ein Memo, das seine Hintergrundfarbe beim Anklicken ändert. Damit ich das nicht beim DBMemo nochmal programmieren mußte, ist das mit einer Overlayclasse dann DB-fähig gemacht worden...

Was ist eine "Overlayclasse" ? :shock: Aber egal : gehe weg von dem DataLink. Das wird zu kompilziert. Wie bereits gesagt : besser die Ereignisse (nicht DB !!)notfalls in eigener Komponente neu machen. Dafür ist der Komponenten-Vorfahr zu rate zu ziehen. Wurde der schon falsch gewählt, tja dann....

stahli 25. Jan 2007 16:05

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

mschaefer 25. Jan 2007 16:11

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

Hansa 25. Jan 2007 17:10

Re: Anzeigeproblem bei eigener DB-Text-Komponente auf DBCtrl
 
Zitat:

Zitat von mschaefer
Hoffe ja, dass vielleicht doch noch jemand einen weiteren Gedanken zu der DBCtrlGrid Sache hat, dann wäre das Verfahren durchgängig gelöst.

Wie gesagt : Marco Cantu. :lol: Nofalls suche ich das PDF-Buch und bräuchte email-Adresse.

mschaefer 26. Jan 2007 08:25

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

stahli 26. Jan 2007 12:46

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:
//------------------------------------------------------------------------------
//
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;
Das sind zwar etwas ältere Quelltexte, das Prinzip sollte aber erkennbar sein...

Gruß Stahli

mschaefer 26. Jan 2007 13:23

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
TJvDBHTLabel doesn't support painting on TDBCtrlGrid


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:49 Uhr.
Seite 2 von 3     12 3      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz