Delphi-PRAXiS
Seite 1 von 2  1 2      

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 11:12


DBmemo in Grid
 
Hi,

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

Leuselator 14. Jan 2004 12: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 20: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 21:17

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

suchts Du so etwas?

fkerber 14. Jan 2004 21: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 22: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 00: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 20: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 11: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 13: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 ?


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:50 Uhr.
Seite 1 von 2  1 2      

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