Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Allgemeine Verständnisfrage (Feld durchsuchen) (https://www.delphipraxis.net/94380-allgemeine-verstaendnisfrage-feld-durchsuchen.html)

Alter Mann 20. Jun 2007 17:05

Datenbank: unbekannt • Zugriff über: unbekannt

Allgemeine Verständnisfrage (Feld durchsuchen)
 
Hallo DB-Profis,

ich habe eine allgemeine Verständnisfrage, vielleicht kann sie ja beantwortet werden.

Für eine Kalender-Componente benötige ich eine 'wie auch immer' Datenbankanbindung.
Also eine DataSource und ein DataField.

Das dazu gehörige Event DateChange sieht bisher so aus:
Delphi-Quellcode:
procedure  TDBCalendarControl.DataChange(Sender: TObject);
var
  DT : TDateTime;
  Y1, Y2, M1, M2, D1, D2 : Word;
begin
  if FDataLink.Field <> nil then
  begin
    if IsDateTimeField then
      DT := Trunc(FDataLink.Field.AsDateTime)
    else
      DT := Trunc(FDataLink.Field.AsDateTime);

    DecodeDate(DT, Y1, M1, D1);
    DecodeDate(FDate, Y2, M2, D2);
    if (Y1 = Y2) and (M1 = M2) then FDates[D1] := DT;
    Invalidate;
  end;
end;
FDates ist ein Array of TDateTime und wird bei jedem Monatswechsel auf 31 gesetzt.
In der procedure Paint erfolgt dann die Auswertung.

Ein 'Fehler' hat diese Vorgehensweise jedoch; Ich kann nur den aktuellen Datensatz auslesen.

Wie müsste ich also vorgehen um alle in Frage kommenden Werte auszulesen, ohne
auf die DB speziell einzugehen?.


Gruss

Alter Mann

marabu 20. Jun 2007 17:43

Re: Allgemeine Verständnisfrage (Feld durchsuchen)
 
Hallo Alter Mann,

die datensensitiven Controls beziehen sich immer auf eine bestimmte Spalte im aktuellen Datensatz.
Auf was soll sich denn deine Komponente TDBCalendarControl beziehen?
Mir scheint du hast da ein Design-Problem.

Nachdenkliche Grüße

shmia 20. Jun 2007 17:46

Re: Allgemeine Verständnisfrage (Feld durchsuchen)
 
Du möchtest also mehrere Datensätze gleichzeitig visualisieren?
So wie das DBGrid mehrere Datensätze (scheinbar gleichzeitig) anzeigt, soll das TDBCalendarControl alle Termine anzeigen?
Das wird nicht einfach!
Schau dir mal die Unit Dbgrids an; du benötigt ungefähr den gleichen Aufwand.
Im Prinzip geht das so:
TDataSet.State wird auf dsBlockRead geschaltet und das Control fährt alle Datensätze ab.
Alle anderen datensensitiven Controls bekommen davon nichts mit, da die Events in diesen State abgeschaltet sind.

Alter Mann 20. Jun 2007 18:05

Re: Allgemeine Verständnisfrage (Feld durchsuchen)
 
Hi,

danke für die Antworten.

@marabu

Ist das DataField nicht eine Spalte?


@shmia

Die Idee mit dem DBGrid hört sich gut an, vielleicht läst sich ja daraus was machen.


Gruss

Alter Mann 20. Jun 2007 19:01

Re: Allgemeine Verständnisfrage (Feld durchsuchen)
 
Hallo,

es ist vollbracht und der Aufwand war 'nicht' so hoch:

Delphi-Quellcode:
  TDBCalendarControl = class(TCalendarControl)
  private
    FDataLink  : TFieldDataLink;
    FMaxRecords : Integer;
    procedure DataChange(Sender: TObject);
  ...
  protected
    procedure LoadDatesForMonth;
  ...

procedure  TDBCalendarControl.DataChange(Sender: TObject);
begin
  if (FDataLink.Field <> nil) and not FDataLink.DataSourceFixed then
  begin
    if FMaxRecords <> FDataLink.DataSet.RecordCount - 1 then
    begin
      FMaxRecords := FDataLink.DataSet.RecordCount - 1;
      FDataLink.DataSourceFixed := True;
      LoadDatesForMonth;
    end;
  end;
end;

procedure  TDBCalendarControl.LoadDatesForMonth;
var
  I : Integer;
  DT : TDateTime;
  Y1, Y2, M1, M2, D1, D2 : Word;
begin
  FDataLink.DataSet.First;
  for I := 0 to FDataLink.DataSet.RecordCount - 1 do
  begin
    if IsDateTimeField then
      DT := Trunc(FDataLink.Field.AsDateTime)
    else
      DT := Trunc(FDataLink.Field.AsDateTime);

    DecodeDate(DT, Y1, M1, D1);
    DecodeDate(FDate, Y2, M2, D2);
    if (Y1 = Y2) and (M1 = M2) then FDates[D1] := DT;
    FDataLink.DataSet.Next;
  end;
  Invalidate;
  FDataLink.DataSourceFixed := False;
end;
Nochmals Danke.


Gruss

Alter Mann


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:17 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