Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Zeilenumbruch innerhalb von einer Stringgrid-Zelle (https://www.delphipraxis.net/32890-zeilenumbruch-innerhalb-von-einer-stringgrid-zelle.html)

Martoeng 29. Okt 2004 10:30


Zeilenumbruch innerhalb von einer Stringgrid-Zelle
 
Hi Leute,

hab mal eine Frage (<-- unerwartet, ne? ;):


Also, ich habe mir zur Datensicherung ein kleines Dump-Programm geschrieben.

Die Sicherung ist auch kein Problem.
Vielleicht etwas merkwürdig, aber es funktioniert:

die Felder werden mit der Zeichenfolge "~;" getrennt.

Da jede Zeile in der Sicherungs-Datei (*.dat) einen eigenen Datensatz darstellt, müssen Zeilenumbrüche, die in Memo-Felder der DB gespeichert sind, ersetzt werden. Dazu habe ich die Zeichenfolge "~#" gewählt.


Jetzt möchte ich, dass man sich diese Sicherungen angucken und ggf. einzelne DS wieder herstellen kann.

Also muss die Zeichenfolge "~#" wieder durch #13#10 ersetzt werden.

Das habe ich so gemacht:
Delphi-Quellcode:
//Zeichenfolge "~#" wieder durch #13#10 ersetzen (RETURN)
for xy := 0 to length(s)-1 do
begin
  if (s[xy] = '~') AND (s[xy+1] = '#') THEN
  begin
    s[xy] := #13;
    s[xy+1] := #10;
  end;
end;
delete(s,1,1); //erstes Zeichen löschen
target.Cells[x,y] := s //target = stringgrid
Doch bei mir erscheinen an den Stellen der Zeilenumbrüche nur genau 4 senkrechte schwarze Balken.

Ich dachte auch schon, dass ein normaler String (s) keine zeilenumbrüche verträgt und bin deshalb einen Umweg über ein Memo gegangen, hat aber auch nicht geklappt :(.

Weiss vielleicht jemand, wo der Fehler liegt?

MfG Martoeng

Meister_Kika 29. Okt 2004 10:49

Re: Zeilenumbruch innerhalb von einer Stringgrid-Zelle
 
1.

Delphi-Quellcode:
var I : integer;

begin
  i := pos('~#',S);
  while i <> 0 do
  begin
    Delete(S,i,2);
    Insert(#13#10,s,i);
    i := pos('~#',S);
  end;
  delete(s,1,1); //erstes Zeichen löschen
   <- ist schneller als deine funk.
  2. das grid malt auf einen canvas.
     d.h #13#10 wird als Pipe | dargestellt.
     musst also die draw routine verbiegen

   als bespiel :
   procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol,
          ARow: Integer; Rect: TRect; State: TGridDrawState);
   var s : string;
       x : integer; //abstand zur nächsten zeile
   begin
       s := target.Cells[ACol,ARow] ;
       while pos(#13#10,s) <> 0 do
       begin
         canvas.textout(Rect.X + x,Rect.Y,copy(S,1,pos(#13#10)-1);
         delete(s,1,pos(#13#10)+1);
         x:= x + canvas.TextHeight(S);
      end;
     canvas.textout(Rect.X + x,Rect.Y,s); //rest zeichen
   end;
was du noch einbauen mußt ist die höhe der zelle sonst mal der ins nirvana.

[edit=sakura] [delphi]Tags Mfg, sakura[/edit]

ibp 29. Okt 2004 11:24

Re: Zeilenumbruch innerhalb von einer Stringgrid-Zelle
 
hallo meister kika verwende doch bitte die delphi tags wegen der übersichtlichkeit!
ansonsten herzlich willkommen bei dp :dp:

himitsu 29. Okt 2004 13:29

Re: Zeilenumbruch innerhalb von einer Stringgrid-Zelle
 
Tut mir Leid, aber TStringGrid kann keine Zeilenumbrücke - selbst wenn der Steuercode für einen Zeilenumbruch im Feldinhalt enthalten ist, werd dennoch nicht's umgebrochen ... Steuercodes werden einfach übersprungen.

Du kannst das höchstens über OnDrawCell selber zeichnen/schreiben.

ibp 29. Okt 2004 14:23

Re: Zeilenumbruch innerhalb von einer Stringgrid-Zelle
 
^himitsu hat recht im ereignis ondrawcell-ereignis musst du die zelle überschreiben:

1. windows sdk mit drawtext ist dein freund mit dt_calcrect, dt_wordbreak und dt_left, zur ermittlung der höhe
2. neue höhe der zelle auf die zeile anwenden
3. zeile neu zeichnen wieder mit drawtext

so sollte es gehen!

Martoeng 1. Nov 2004 07:38

Re: Zeilenumbruch innerhalb von einer Stringgrid-Zelle
 
Einen schönen Montag- Morgen :(,

Hmm, danke für die Antworten...

klingt ja alles ganz schön kompliziert, nur für ein paar Zeilenumbrüche...

Wenn ich mich recht erinnere, habe ich aber früher schon Zeilenumbrüche in ein Stringgrid gedrängt. Da habe ich einfach den text eines Memos übernommen und die Zeilenumbrüche waren an den richtigen Stellen noch vorhanden. Es wurde zwar nicht der ganze Text gezeichnet (je nachdem wie hoch die Zelle ist), aber das ist auch unwichtig, da der Text später nur möglichst einfach in ein DB-Memo eingefügt werden soll.

Genauso hat es auch schon geklappt, dass ich Text aus einer Tabelle (Feldtyp: longtext, MySQL) in ein Stringgrid geladen habe und auch da wurden die Zeilenumbrüche "mitgenommen".

Also wird das schon nicht völlig unmöglich sein, oder ;) ?

Naja, ich werde nochmal rumprobieren, vielleicht komm ich ja noch drauf...


Danke trotzdem...
MfG


Martoeng

ibp 1. Nov 2004 08:44

Re: Zeilenumbruch innerhalb von einer Stringgrid-Zelle
 
natürlich ist es möglich komponenten in ein stringgrid zu platzieren, für ein bisschen text sollte das aber mit kanonen auf spatzen geschossen sein!

Martoeng 1. Nov 2004 08:51

Re: Zeilenumbruch innerhalb von einer Stringgrid-Zelle
 
???

Komponenten im Stringgrid platzieren?
Sowas geht? ;)

Ne, wusste ich bis heute nicht, dass das geht, und ich würde behaupten, ich habe das auch nie gemacht. (zumindest nicht bewusst)

Ich habe das Programm nochmal rausgesucht, in dem ich diese Zeilenumbrüche schon hatte.

Da hatte ich halt ein Memo, in das Text eingegeben wurde und mit

Delphi-Quellcode:
Strgrid1.Cells[3, Strgrid1.RowCount-1] := Memo1.Text;
in das Stringgrid eingefügt. Da wurden alle Zeilenumbrüche, egal ob manuell oder automatisch, mit übernommen.

Wie bekomme ich es also hin, diese Zeilenumbrüche selbst in ein Stringgrid einzutragen?
Nochmals, der Text muss nicht voll lesbar sein, er muss nur in der Zelle komplett vorhanden sein...


MfG & Thx

Martoeng

ibp 1. Nov 2004 09:09

Re: Zeilenumbruch innerhalb von einer Stringgrid-Zelle
 
guckst du: komponente in stringgrid platzieren!

Martoeng 1. Nov 2004 09:13

Re: Zeilenumbruch innerhalb von einer Stringgrid-Zelle
 
Juchuu, ich habs:


Einfach in die DrawCell:

Delphi-Quellcode:
var
  s : string;
begin
  s := strgr_ansicht.Cells[ACol, ARow];

  strgr_ansicht.Canvas.FillRect(Rect);
 
  DrawText(strgr_ansicht.canvas.Handle, PChar(s), Length(s), Rect, DT_left+DT_Vcenter);
end;
Fragt mich nicht, warum, aber jetzt werden die #13#10 auch als Zeilenumbruch gehandhabt...



Also danke für die Hilfen (und es geht doch! ;))


MfG

Martoeng


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