Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Zellen verbinden (https://www.delphipraxis.net/116317-zellen-verbinden.html)

Razor90 26. Jun 2008 18:04


Zellen verbinden
 
Ich möchte nun zwei Zellen di untereinander sind miteinander verbinden. Ich habe folgenden Code gefunde:
Delphi-Quellcode:
   If gdFixed In State Then Exit;
     If ARow > 1 Then Exit; }
     with sender as tstringgrid do begin
     If aCol < Pred(ColCount) Then
      Rect.Right := Rect.Right + 2 GridlineWidth;
    y:= Rect.Top +2;
    x:= Rect.Left +2;
    for i:= 1 to aCol-1  do
      x:= x - ColWidths[i] - GridlineWidth;

   end;
wie muss ich diesen nun umändern um mein problem zu lösen?

mkinzler 26. Jun 2008 18:32

Re: Zellen verbinden
 
Wo hast du den Code denn gefunden? Denn funktionieren tut er bestimmt nicht.
Überlege mal wie du grundsätzlich vorgehen würdest und versuch das auf Delphi zu übertragen

oki 26. Jun 2008 18:57

Re: Zellen verbinden
 
Zellen von Was? [edit] obwohl mir bei dem Codeschnipsel die Augen weh tun hab ich den dezenten Hinweis auf StringGrid gefunden. Somit ist die erste Frage abgehakt. [/edit oki]
Warum verbinden?
Mit welchem Ziel?

Razor90 26. Jun 2008 19:14

Re: Zellen verbinden
 
Es handelt sich um eine Stringgrid. Den Text, denn ich in eine Zelle schreiben möchte passt dort nicht rein, weshalb ich gerne unterienader in zwei Zellen schreiben würde.

oki 26. Jun 2008 19:19

Re: Zellen verbinden
 
Also, Zellen verbinden wie in Exel kannst du nicht. Dir bleibt dann nur die Möglichkeit ein OwnerDraw durchuführen und die Zellen zur Laufzeit zu übermalen und den Text in das vergrößerte Rect zu schreiben. Oder du vergrößerst die Zeilenhöhe. Aber dann musst du für den Zeilenumbruch auch wieder auf den Canvas schreiben.

Gruß oki

Razor90 26. Jun 2008 19:35

Re: Zellen verbinden
 
ownerdraw...kA was das ist.. DeddyH hat mir schon geholfen:
Delphi-Quellcode:
begin
  if (ARow=1) then //Zeilen 1 und 2 verbinden
    with Sender as TStringGrid do
      begin

        R := Classes.Rect(Rect.Left,
                          Rect.Top - (Rect.Bottom - Rect.Top),
                          Rect.Right,
                          Rect.Bottom);
        Canvas.Brush.Color := clRed;
        Canvas.FillRect(R);
        DrawText(Canvas.Handle,
                 PChar(Cells[ACol, ARow]),
                 -1,
                 R,
                 DT_CENTER or DT_VCENTER or DT_SINGLELINE);
      end;
end;
nur leider erscheint jetzt kein Text mehr... Jmd ne Idee???

mkinzler 26. Jun 2008 19:42

Re: Zellen verbinden
 
Zitat:

ownerdraw...kA
= Selberzeichnen, was ja Detlefs Code macht.
In welche Methode hast du den Code geschrieben?

Razor90 26. Jun 2008 19:46

Re: Zellen verbinden
 
in stringgriddraw cell...nur es funktioniert ja, aber der text ist weg!!!

oki 26. Jun 2008 19:54

Re: Zellen verbinden
 
DT_SINGLELINE erzeugt einen einzeiligen Text im Rect. Du wolltest doch mehrzeilig schreiben.

Und da wird wohl was mit deinem Rect nicht stimmen.

Wo hat DeddyH dir geholfen? ich sehe keinen Beitrag.

oki

Razor90 26. Jun 2008 19:57

Re: Zellen verbinden
 
per pn^^ ich mach den text dann per hand zweizeilig, also mit stringgridlcells[x,y]:='';, das krieg ich hin...nur warum steht jetzt überhaupt nix mehr da????

taaktaak 26. Jun 2008 19:59

Re: Zellen verbinden
 
Moin, Moin.

Delphi-Quellcode:
DrawText(Canvas.Handle,
                 PChar(Cells[ACol, ARow]),
                 -1,
                 R,
                 DT_CENTER or DT_VCENTER or DT_SINGLELINE);
..erscheint mir seltsam!

Dort wo jetzt -1 steht, sollte eigentlich die Länge des Strings angegeben werden.

Razor90 26. Jun 2008 20:00

Re: Zellen verbinden
 
moinsen...aha...was kann man da machn?

oki 26. Jun 2008 20:02

Re: Zellen verbinden
 
@taaktaak: das mit dem -1 ist schon ok.

Aber das mit deinem
Zitat:

ch mach den text dann per hand zweizeilig, also mit stringgridlcells[x,y]:='';,
versteh ich nicht.

Warum glaubst du, dass es geht wenn du nichts siehst?

oki 26. Jun 2008 20:05

Re: Zellen verbinden
 
nehm das singleline raus und DT_WORDBREAK in DrewText als Flag rein, dann wird der Text im Rect umgebrochen.

Gruß oki

taaktaak 26. Jun 2008 20:05

Re: Zellen verbinden
 
Wieso ist -1 ok? Verstehe ich nicht!

taaktaak 26. Jun 2008 20:07

Re: Zellen verbinden
 
ahhh,
Zitat:

If nCount is -1, then the lpString parameter is assumed to be a pointer to a null-terminated string and DrawText computes the character count automatically.
na denn ...

oki 26. Jun 2008 20:08

Re: Zellen verbinden
 
dann wird die länge als gesamte Textlänge bis #0 genommen. Probiers aus. Geht.

probier mal das:
Delphi-Quellcode:
DrawText((Sender as TStringGrid).Canvas.Handle,
                 PChar(Cells[ACol, ARow]),
                 -1,
                 R,
                 DT_CENTER or DT_VCENTER or DT_SINGLELINE);
Grrr roter Kasten!!

Razor90 26. Jun 2008 20:10

Re: Zellen verbinden
 
Also mal ganz grundsätzlich, damit ihr mich vll besser versteht:

Ich habe eine Tabelle, und in die Zellen passt mein Text nicht komplett rein. Zellengröße ändern bringt auch nix, da ich sonst immerzu nach links und rechts scrollen müsste.
So siehts jetzt aus:

|---------|---------|---------|
|Jahr 200|Jahr 200|Jahr 200|
|---------|---------|---------|
|---------|---------|---------|
|---------|---------|---------|
Also ihr seht das die Jahreszahl nich in die Zelle passt.
Dehalb dachte ich mir ich verteil das Clever auf zwei Zellen, und damit das besser aussieht verbinde ich die Zellen, wie bei Ecel. Und zwar so soll es aussehen:

|---------|---------|---------|
|..Jahr..|...Jahr..|...Jahr..|
|..2008.|..2009.|..2010.|
|---------|---------|---------|
|---------|---------|---------|
|---------|---------|---------|

So...vorhin meinte ich, das ich "Jahr" per Hand in die obere, und das Jahr "2008" per Hand in die untere Zelle eintrage...
Das ist auch schon geschene. Jedoch seh ich nichts. wenn ich die Zellen so lasse wie sie sind ohne zu verbinden siehts so aus wie oben und das will ich eben nicht... mfg

taaktaak 26. Jun 2008 20:13

Re: Zellen verbinden
 
Das soll doch wohl in den obersten beiden Zeilen stehen! Oder?

Razor90 26. Jun 2008 20:13

Re: Zellen verbinden
 
Delphi-Quellcode:
DrawText((Sender as TStringGrid).Canvas.Handle,
                 PChar(Cells[ACol, ARow]),
                 -1,
                 R,
                 DT_CENTER or DT_VCENTER or DT_SINGLELINE);
hat nicht geholfen... :(
Wenn ich die Zellen markeire, also mit dem Mauszeiger langfahre verschwindet das rot und es kommt wieder garu zum Vorschein mit dem Text, lass ich die Maus los wirds wieder rot...

Razor90 26. Jun 2008 20:14

Re: Zellen verbinden
 
jap in den oberen beiden

oki 26. Jun 2008 20:14

Re: Zellen verbinden
 
Du kannst nicht was über zells in die Zelle schreiben und im Ownerdraw ein rotes Rechteck drüber malen. Wenn dann alles im ownerdraw.

Razor90 26. Jun 2008 20:17

Re: Zellen verbinden
 
aha...und wie schreib ich dann im ownerdraw??? Hab jetzt schon ne fertige unti wo die ganzen verwiese auf die zellen sind...

oki 26. Jun 2008 20:22

Re: Zellen verbinden
 
Sorry, das war Blödsinn was ich mit der Zelle gesagt hab. Das haut schon hin.

Speicher mal den Text in eine lokale Variable (String) und übergib die mal mit PChar() in DrawText.

Razor90 26. Jun 2008 20:24

Re: Zellen verbinden
 
so in etwa???
Delphi-Quellcode:
form15.stringgrid1.cells[1,0]:=PChar('Verbrauch')
das hat nix gebracht...

oki 26. Jun 2008 20:26

Re: Zellen verbinden
 
Nee,

Delphi-Quellcode:
  MyStr := (Sender as TStringGrid).cells[Col, Row];
  DrawText((Sender as TStringGrid).Canvas.Handle,
                 PChar(MyStr),
                 -1,
                 R,
                 DT_CENTER or DT_VCENTER or DT_SINGLELINE);

taaktaak 26. Jun 2008 20:30

Re: Zellen verbinden
 
Liste der Anhänge anzeigen (Anzahl: 1)
Also, habe das mal nachgestellt:

Delphi-Quellcode:
procedure TfoTest05.StringGrid1DrawCell(Sender: TObject; ACol,
  ARow: Integer; Rect: TRect; State: TGridDrawState);

  var r: TRect;
begin
 if aRow=1 then
  if acol=1 then
   with TStringgrid(Sender) do begin

    R := Classes.Rect(Rect.Left+1,
                      Rect.Top - (Rect.Bottom - Rect.Top),
                      Rect.Right-1,
                      Rect.Bottom-1);

    Canvas.Brush.Color := clRed;
    Canvas.FillRect(R);
    DrawText(Canvas.Handle,
                 PChar('Hallo ich bin es, der hier was schreibt'),
                 -1,
                 R,
                 DT_CENTER or DT_VCENTER or DT_wordbreak);
                 end;

                 sm('');


end;
Damit wird in Spalte 1 (also 2te) der Text in die beiden(!) Zellen der FixedRows (0+1)geschrieben. Ist aber der 3D-Effekt eaktiviert, dann wird dieser Effekt offenbar beim Zeichenen der nächsten Zell für die Zelle davor "gemalt" deswegen erscheint eine weiße Trennlinie im "zusammengeführten" Feld.

// hier mal ein kleines Bild vom Ergebnis

Razor90 26. Jun 2008 20:32

Re: Zellen verbinden
 
tut mir leid...ich bin noch neuling und hab jetzt gar keine ahnung was ich mit deinem ebend geposteten befehl machen sol...hab das jetzt wie bei ondrawcell neu eingefügt und mystr als string deklariert...was nung? wie mach ich die textausgabe aus meinen record (array)?

oki 26. Jun 2008 20:35

Re: Zellen verbinden
 
Irgentwie gehen hier die ganzen Formatierungen über den Haufen. Ich seh schon nicht mehr durch.

@taaktaak: Was ist
Delphi-Quellcode:
                 sm('');
Ich glaub, das liegt an dem direkten Zellenzugriff in DrawText. Der Text muss in eine Variable. Oder ic hseh nicht mehr durch.

Gruß oki

taaktaak 26. Jun 2008 20:37

Re: Zellen verbinden
 
Ahh, sorry, ein ShowMessage() für schreibfaule Menschen ... Ist hier unwichtig, war nur zum Stoppen der einzelnen Schritte

Razor90 26. Jun 2008 20:39

Re: Zellen verbinden
 
hey...
taaktaak, das is genau das richtige!!!! Danke

taaktaak 26. Jun 2008 20:41

Re: Zellen verbinden
 
Jooo, aber das mit dem 3D-Effekt ist natürlich Mist. Da muss ich noch mal etwas grübeln....

oki 26. Jun 2008 20:41

Re: Zellen verbinden
 
Grrr wieder roter Kasten :cry: :cry:

Die Textausgabe machst du mit DrawText. So wie schon geschrieben.

Ich mach noch mal den Code fertig.

So hier:
Delphi-Quellcode:
procedure TfoTest05.StringGrid1DrawCell(Sender: TObject; ACol,
  ARow: Integer; Rect: TRect; State: TGridDrawState);

var r: TRect;
    MyStr : String;
begin
if aRow=1 then begin
  if acol=1 then begin
    with TStringgrid(Sender) do begin
      R := Classes.Rect(Rect.Left+1,
                        Rect.Top - (Rect.Bottom - Rect.Top),
                        Rect.Right-1,
                        Rect.Bottom-1);

      Canvas.Brush.Color := clRed;
      Canvas.FillRect(R);
      MyStr := Cells[ACol, ARow-1];
      DrawText(Canvas.Handle,
               PChar(MyStr),
               -1,
               R,
               DT_CENTER or DT_VCENTER or DT_wordbreak);
    end;
  end;
end;

Razor90 26. Jun 2008 20:46

Re: Zellen verbinden
 
cool...langsam wirds genau so wie ich es mir vorgestellt hab...VIELEN DANK!! wenn ich jetzt auf das obere feld klicke verschwindet die markierung....es soll gar nich rot sein, sonder clBtnFace...

oki 26. Jun 2008 20:48

Re: Zellen verbinden
 
so denne, ändere clred in clBtnFace

Razor90 26. Jun 2008 20:49

Re: Zellen verbinden
 
hab ich schon gemacht ;)

oki 26. Jun 2008 20:51

Re: Zellen verbinden
 
nur mal am Rande. Der Fehler war, dass der Text in Zeile 0 steht. Das Verbinden wird aber in Zeile 1 vorgenommen. Somit muß der Zellzugriff ARow-1 sein.

Razor90 26. Jun 2008 20:54

Re: Zellen verbinden
 
wenn ich das mache sind die zellen nicht mehr verbunden, also 0 und 1 sollen verbunde werden

taaktaak 26. Jun 2008 20:54

Re: Zellen verbinden
 
Liste der Anhänge anzeigen (Anzahl: 1)
So, die Lösung unter Berücksichtigung des 3D-Effekt (fast OK):

Delphi-Quellcode:
procedure TfoTest05.StringGrid1DrawCell(Sender: TObject; ACol,
       ARow: Integer; Rect: TRect; State: TGridDrawState);

var r: TRect;
begin
 if aRow=1 then
  if acol=2 then // << in Spalte 2 wird der Inhalt von Spalte 1 gezeichnet
   with TStringgrid(Sender) do begin

    R := Classes.Rect(Rect.Left-ColWidths [ACol-1], // << !!!
                      Rect.Top -RowHeights[ARow-1], // << !!
                      Rect.Left-2,
                      Rect.Bottom-1);

    Canvas.Brush.Color := clRed;
    Canvas.FillRect(R);
    DrawText(Canvas.Handle,
                 PChar('Hallo ich bin es, der hier was schreibt'),
                 -1,
                 R,
                 DT_CENTER or DT_VCENTER or DT_WORDBREAK);
    end;
  end;
end;
Jetzt zeichnen wird eine Spalte SPÄTER - nachdem das Grid den 3D-Effekt gemalt hat - unsren Text in die VORHERGEHENDE Spalte! Jetzt sind nur noch winzige Punkte vom 3d-Effekt an den Aussenseiten zu sehen!

oki 26. Jun 2008 20:58

Re: Zellen verbinden
 
und wo ist dein Text?


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