Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi DBmemo in Grid (https://www.delphipraxis.net/14704-dbmemo-grid.html)

Hansa 14. Jan 2004 12:12


DBmemo in Grid
 
Hi,

weiß jemand, wie ich ein DBmemo in ein DBgrid/Grid reinkriege ??

Leuselator 14. Jan 2004 13:06

Re: DBmemo in Grid
 
Kühlschrank auf, Kuh raus, Elefant...
Delphi-Quellcode:
  TLsDbGrid = class(TDBGrid)
  private
    FOnSelectCell: TSelectCellEvent;
  protected
    function SelectCell(ACol, ARow: Longint): Boolean; override;
  public
    function CellRect(ACol, ARow: Longint): TRect;
  published
    property OnSelectCell: TSelectCellEvent read FOnSelectCell write FOnSelectCell;
  end;
implementation

function TLsDbGrid.SelectCell(ACol, ARow: Integer): Boolean;
begin
  Result := True;
  if Assigned(FOnSelectCell) then FOnSelectCell(Self, ACol, ARow, Result);
end;

function TLsDbGrid.CellRect(ACol, ARow: Integer): TRect;
begin
  Result := inherited CellRect(ACol, ARow);
end;
Das als Componente registrieren und statt normalem DbGrid benutzen
Einfach auf DBGrid DBMemo pappen, Breite, Höhe und DataSource/Field festlegen und Visible = False
Anwendung:
Delphi-Quellcode:
// SQL: select *,'...' as MemoDummy from Tabelle

// OnSelectCell:
procedure TForm1.LsDbGrid1SelectCell(Sender: TObject; ACol, ARow: Integer; var CanSelect: Boolean);
var R: TRect;
begin
  R := FldbgrdBeitrag.CellRect(ACol, ARow);
  R.Left  := R.Left  + LsDbGrid1.Left;
  R.Right := R.Right + LsDbGrid1.Left;
  R.Top   := R.Top   + LsDbGrid1.Top;
  R.Bottom := R.Bottom + LsDbGrid1.Top;
  DbMemo1.Visible := False;
  case ACol of
    0,1,2,4:;
    3: begin // angenommen, das wär die Spalte für MemoDummy
         DbMemo1.Left := R.Left+1;
         DbMemo1.Top := R.Top+1; // Größe sollte bei Memo nicht auf Zelle beschränkt sein...
         DbMemo1.Visible := True; // sichtbar machen
         CanSelect := False;
       end;
  end;
end;
Gruß

Hansa 14. Jan 2004 21:25

Re: DBmemo in Grid
 
Liste der Anhänge anzeigen (Anzahl: 2)
Leuselator, Du programmierst so ähnlich, wie ich es versuche. 8) Aber diese Pixel-Zeichnerei, das ist für mich ein Greuel. Aber das rückt mir alles auf die Pelle. Also muß ich da durch. Leuselator hat das DBgrid um OnSelectCell erweitert. Bei mir sieht das jetzt so wie im Anhang aus. Der andere Anhang ist eine Excel-Tabelle, so wie es aussehen soll. Ich bräuchte im Prinzip nur ein paar Textzeilen in einer Spalte, aber wer weiß wie viele ? Rechts und links davon gibt es nur jeweils eine Zeile je Position. Wie man sieht kann ich das Memo/Blob schon irgendwie in dem DBgrid unterbringen.

Für mich stellt sich jetzt die Frage, ob das so gehen könnte. Im Moment mache ich das alles mit einem StringGrid, starr fixiert auf 2 Zeilen nur Text, nur in EINER Spalte. Beim Eingeben von Daten geht das noch, aber bei reiner Ausgabe wäre das DBgrid schon von Vorteil.

P.S.: Screenshots natürlich vergessen

Whats that ? Jetzt dafür doppelt, obwohl angeblich nur 2 gehen. :mrgreen:

r_kerber 14. Jan 2004 22:17

Re: DBmemo in Grid
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Hansa,

suchts Du so etwas?

fkerber 14. Jan 2004 22:32

Re: DBmemo in Grid
 
Hi!

Sorry ist leider OT, aber ich dachte, es müsste mal gesagt werden:

Macht Screenshots doch bitte als JPG und nicht als 1,37 MB große BMP, da brauch ich ja trotz DSL ne halbe Stunde für eins.

Danke.

Ciao fkerber

Hansa 14. Jan 2004 23:18

Re: DBmemo in Grid
 
Ist hier Kerber-Time, ich denke das heißt Happy-Hour und alles wird billiger ? :P

@fkerber : kannst jetzt ruhig downloaden

@r_kerber: so in der Richtung, nur ohne Fische. :lol: Allerdings würde ich das lieber selber machen, wegen D8

eddy 15. Jan 2004 01:18

Re: DBmemo in Grid
 
Hallo Hansa,

hier noch eine getestete Variante.

Code:
procedure TFDaSi.dbg1DrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
const
  // Es werden die ersten 35 Zeichen des Memofeldes ausgelesen
  iDisplayWidth = 35;
var
  i : integer;
  szTxt: array[0..iDisplayWidth] of char;
  aBS: TBlobStream;
  s : string;
  sTxt: String[iDisplayWidth];

  vTBlobField : TBlobField;

begin
  vTBlobField := TBlobField.Create(Self);
  {muß für jedes Feld der möglichen Tabellen einzeln definiert werden,
   funktioniert also nur, wenn man genau weiß, wie die Felder heißen}
  if Column.FieldName = 'InklFilter' then vTBlobField := Tab1InklFilter;
  if Column.FieldName = 'ExklFilter' then vTBlobField := Tab1ExklFilter;

  if (Column.Field is TMemoField) then begin
    aBS := TBlobStream.Create(vTBlobField, bmRead);
    FillChar(szTxt, SizeOf(szTxt), #0);
    try
      aBS.Read(szTxt, iDisplayWidth);
    finally
      aBS.Free;
    end;
    s := StrPas(szTxt);
    sTxt := '';
    i := 1;
    while not ((i > length(s)) or (length(sTxt) >= iDisplayWidth)) do begin
      if (ord(s[i]) > $20)
        then sTxt := sTxt + s[i]
        else
          {nur wenn nicht zuvor bereits ein Leerzeichen steht}
          if (length(sTxt)>0) and (sTxt[length(sTxt)] <> ' ')
          then sTxt := sTxt + ' ';
      inc(i);
    end;

    with (Sender as TDBGrid).Canvas do begin
      FillRect(Rect);
      TextOut(Rect.Left, Rect.Top, sTxt);
    end;
  end;
end;
mfg
eddy

Hansa 15. Jan 2004 21:29

Re: DBmemo in Grid
 
Hi,

was macht denn der Code genau ? Habe den mal 1:1 übernommen. Insbesondere hier :

Delphi-Quellcode:
if Column.FieldName = 'ExklFilter' then
  vTBlobField := Tab1ExklFilter;
gehts nicht weiter. Was ist Tab1ExklFilter :?: Kommentiere ich das aus, läuft das Programm zwar, aber vor der wohl unvermeidlichen Fehlermeldung sieht das Grid genauso aus, wie vorher. Was soll das da bringen ?

[edit=r_kerber]Doppeltes Posting gelöscht. Mfg, r_kerber[/edit]

eddy 17. Jan 2004 12:01

Re: DBmemo in Grid
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Hansa,

hab' erst heute wieder reingesehen, daher die Verzögerung.

Is' nix mit 1:1-Übernahme, mußt natürlich Deine Feldnamen anpassen.

MInklFilter und MExklFilter sind vom Typ TMemo und nehmen Filterbedingungen für Dateien an (siehe Bilder). Im DBGrid wird dann nicht (MEMO) angezeigt, sondern max. die vordefinierte Anzahl Zeichen (iDisplayWidth).

Tab1InklFilter und Tab1ExklFilter ergeben sich aus der Definition im OI

Der Darstellungsunterschied ist doch irgendwie gut erkennbar.

mfg
eddy


PS: Bild nicht herunterladen, da gibt's bloß Blödsinn !!! Nehmt nächsten Download, der funktioniert.

Hansa 17. Jan 2004 14:05

Re: DBmemo in Grid
 
Ich kann aus dem Screenshot nicht viel herauslesen. Zumindeest nichts, was mit dem Memo zu tun hat. Außer, daß rechts Memo seht und in der Mitte ein paar freie Zeilen drin sind.

Bei mir heißt das Feld in der Datenbank BEZ und läßt sich über diesen Namen auch ansprechen und in einem DBmemo anzeigen. Wo kommt bei Dir der Prefix Tab1 überhaupt her ?

eddy 17. Jan 2004 14:18

Re: DBmemo in Grid
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Hansa,

wenn Du das so sagst, nachdem ich den Download angesehen habe, muß ich Dir zustimmen.

Hier noch ein Versuch, mal sehen, ob's besser wird.

mfg
eddy


PS: Hab's sicherheitshalber gleich noch getestet, jetzt kommt das Bild, wie es soll. Keine Ahnung, was da schief gegangen ist. Vielleicht hatte ich die Datei noch in Paint offen.

Hansa 17. Jan 2004 14:32

Re: DBmemo in Grid
 
Aus dem Bild werde ich nicht schlau. Der Code sieht jetzt so aus:


Delphi-Quellcode:
  vTBlobField := TBlobField.Create(Self);
  {muß für jedes Feld der möglichen Tabellen einzeln definiert werden,
   funktioniert also nur, wenn man genau weiß, wie die Felder heißen}

  if Column.FieldName = 'BEZ' then
    vTBlobField := BEZ;

 vTBlobField := TBlobField.Create(Self);
  {muß für jedes Feld der möglichen Tabellen einzeln definiert werden,
   funktioniert also nur, wenn man genau weiß, wie die Felder heißen}
  if Column.FieldName = 'InklFilter' then vTBlobField := Tab1InklFilter;
  if Column.FieldName = 'ExklFilter' then vTBlobField := Tab1ExklFilter;
Die obere Hälfte ist das von mir. Natürlich beschwert Delphi sich über BEZ. "inkompatible Typen string und TBlobField". Also woher kommt Dein Tab1blabla ???

eddy 17. Jan 2004 20:52

Re: DBmemo in Grid
 
Hallo Hansa,

Tab1 : TTable (Paradox-DB)

Tab1??klFilter entsteht, wenn man während der Entwurfszeit auf das entsprechende Symbol für Tab1 klickt und Felder hinzufügen wählt.

Sicherlich gibt es auch einen anderen Weg, aber da ich das nur ein Mal verwendet habe, gab ich mich mit dieser Variante zufrieden.

Was gibt es an den Bildern nicht zu verstehen?

recht: Beispiel für Eingabe im Memofeld
mitte: Anzeige des Memofeldes im DBGrid unter Nutzung des o.g. Programm-Codes
rechts: Standard-Anzeige in meinem DB-Browser, Borland's DB-Oberfläche zeigt statt "(MEMO)" = Memo in runden Klammern "<BLOB Memo>" = Blob Memo in eckigen Klammern an

Und wenn ich Dich richtig verstanden habe, wolltest Du doch im DBGrid die Darstellung wie in der Mitte angezeigt (anstatt von einem unnützen Standard-Text)

mfg
eddy

r_kerber 31. Jan 2004 09:57

Re: DBmemo in Grid
 
Zitat:

Zitat von Hansa
@r_kerber: so in der Richtung, nur ohne Fische. :lol: Allerdings würde ich das lieber selber machen, wegen D8

Hierzu eine Auszug aus der Mail des Herstellers:
Zitat:

Zitat von Todd Powell
ObjectSight
Yes, we are planning to release TopGrid for the Delphi 8 .NET environment. We have been tied up with the new features and beta release of TopGrid V3 though, and are not yet ready for the .Net. We should be addressing the .NET release this spring.



Alle Zeitangaben in WEZ +1. Es ist jetzt 21:58 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 by Thomas Breitkreuz