AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Allgemeine Verständnisfrage (Feld durchsuchen)
Thema durchsuchen
Ansicht
Themen-Optionen

Allgemeine Verständnisfrage (Feld durchsuchen)

Ein Thema von Alter Mann · begonnen am 20. Jun 2007 · letzter Beitrag vom 20. Jun 2007
Antwort Antwort
Alter Mann

Registriert seit: 15. Nov 2003
Ort: Berlin
946 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#1

Allgemeine Verständnisfrage (Feld durchsuchen)

  Alt 20. Jun 2007, 18:05
Datenbank: unbekannt • Zugriff über: unbekannt
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
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#2

Re: Allgemeine Verständnisfrage (Feld durchsuchen)

  Alt 20. Jun 2007, 18:43
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
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#3

Re: Allgemeine Verständnisfrage (Feld durchsuchen)

  Alt 20. Jun 2007, 18:46
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.
Andreas
  Mit Zitat antworten Zitat
Alter Mann

Registriert seit: 15. Nov 2003
Ort: Berlin
946 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#4

Re: Allgemeine Verständnisfrage (Feld durchsuchen)

  Alt 20. Jun 2007, 19:05
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
  Mit Zitat antworten Zitat
Alter Mann

Registriert seit: 15. Nov 2003
Ort: Berlin
946 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#5

Re: Allgemeine Verständnisfrage (Feld durchsuchen)

  Alt 20. Jun 2007, 20:01
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
  Mit Zitat antworten Zitat
Antwort Antwort


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 00:47 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