AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein GUI-Design mit VCL / FireMonkey / Common Controls Delphi Anzeigeproblem bei eigener DB-Text-Komponente auf DBCtrlGrid
Thema durchsuchen
Ansicht
Themen-Optionen

Anzeigeproblem bei eigener DB-Text-Komponente auf DBCtrlGrid

Ein Thema von mschaefer · begonnen am 25. Jan 2007 · letzter Beitrag vom 27. Jan 2007
Antwort Antwort
Seite 2 von 3     12 3      
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.336 Beiträge
 
Delphi 11 Alexandria
 
#11

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

  Alt 25. Jan 2007, 13:01
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
  Mit Zitat antworten Zitat
Benutzerbild von mschaefer
mschaefer

Registriert seit: 4. Feb 2003
Ort: Hannover
2.029 Beiträge
 
Delphi XE3 Enterprise
 
#12

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

  Alt 25. Jan 2007, 13:05
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
Martin Schaefer
  Mit Zitat antworten Zitat
Benutzerbild von mschaefer
mschaefer

Registriert seit: 4. Feb 2003
Ort: Hannover
2.029 Beiträge
 
Delphi XE3 Enterprise
 
#13

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

  Alt 25. Jan 2007, 15:36
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.


Viele Grüße // Martin
Martin Schaefer
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#14

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

  Alt 25. Jan 2007, 15:46
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" ? 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....
Gruß
Hansa
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.336 Beiträge
 
Delphi 11 Alexandria
 
#15

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

  Alt 25. Jan 2007, 16:05
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
  Mit Zitat antworten Zitat
Benutzerbild von mschaefer
mschaefer

Registriert seit: 4. Feb 2003
Ort: Hannover
2.029 Beiträge
 
Delphi XE3 Enterprise
 
#16

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

  Alt 25. Jan 2007, 16:11
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
Martin Schaefer
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#17

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

  Alt 25. Jan 2007, 17:10
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. Nofalls suche ich das PDF-Buch und bräuchte email-Adresse.
Gruß
Hansa
  Mit Zitat antworten Zitat
Benutzerbild von mschaefer
mschaefer

Registriert seit: 4. Feb 2003
Ort: Hannover
2.029 Beiträge
 
Delphi XE3 Enterprise
 
#18

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

  Alt 26. Jan 2007, 08:25
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
Martin Schaefer
  Mit Zitat antworten Zitat
Benutzerbild von stahli
stahli

Registriert seit: 26. Nov 2003
Ort: Halle/Saale
4.336 Beiträge
 
Delphi 11 Alexandria
 
#19

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

  Alt 26. Jan 2007, 12:46
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
  Mit Zitat antworten Zitat
Benutzerbild von mschaefer
mschaefer

Registriert seit: 4. Feb 2003
Ort: Hannover
2.029 Beiträge
 
Delphi XE3 Enterprise
 
#20

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

  Alt 26. Jan 2007, 13:23
Moin, moin,


Marabu hat recht!

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
Martin Schaefer
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:16 Uhr.
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