Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi In eine Zeile in einem Richtext mehrere texte einfügen. (https://www.delphipraxis.net/110566-eine-zeile-einem-richtext-mehrere-texte-einfuegen.html)

Power-Poler 20. Mär 2008 08:26


In eine Zeile in einem Richtext mehrere texte einfügen.
 
Hi

Ich habe volgendes Problem:
Und zwar möchte ich in ein Richtext feld 2-3 texte in einer zeile unterbringen.
Sie sollen aber immer an der selben Position landen, also egal wie lang der eine ist, der andere Text soll trotzdem an die gleiche stelle wie vorher, also ungefähr so:
Code:
Test1      Test2      Test3
Dieter1    Dieter2    Dieter3
und nicht so:
Test1      Test2      Test3
Dieter1      Dieter2      Dieter3
Also egal wie lang das wort, oder der Satz ist, sie sollen immer untereinander stehn.
Ich hoffe ihr versteht was ich meine :|

Danke im Voraus
Mfg
Power-Poler

moperswings 20. Mär 2008 08:48

Re: In eine Zeile vin einem Richtext mehrere texte einfügen.
 
Wie kommen denn die Texte in das RichEdit?

Power-Poler 20. Mär 2008 09:03

Re: In eine Zeile vin einem Richtext mehrere texte einfügen.
 
So:
Delphi-Quellcode:
RichEdit1.Clear;
RichEdit1.Lines.Insert(0,'');
RichEdit1.SelAttributes.Size := 15;
RichEdit1.Lines.Insert(1,'        Text1');;
RichEdit1.SelAttributes.Size := 10;
RichEdit1.Lines.Insert(2,'      ' + Variable1 + 'Text2' + 'Text3');
RichEdit1.Lines.Insert(3,'');
RichEdit1.SelAttributes.Size := 10;
RichEdit1.Lines.Insert(4,'      ' + Variable2 + 'text4' + 'Text5');
RichEdit1.SelAttributes.Size := 10;
RichEdit1.Lines.Insert(5,'      ' + Variable3 + 'text6' + 'Text7');
RichEdit1.SelAttributes.Size := 10;
RichEdit1.Lines.Insert(6,'      ' + Variable4 + 'Text8' + 'Text8');
RichEdit1.Lines.Insert(7,'');
Den code verwände ich dafür.

und die Texte, 2-8, sollen immer untereinander stehn, egal wie lang die Variable1-4 ist
Variable 1-4 sind String's mit unterschiedlich langen Texten drin, die verändert werden können

Der.Kaktus 20. Mär 2008 09:11

Re: In eine Zeile vin einem Richtext mehrere texte einfügen.
 
Hallo,

anstelle der Leerzeichen einfach #9 (Tab) einsetzen.

Power-Poler 20. Mär 2008 09:15

Re: In eine Zeile vin einem Richtext mehrere texte einfügen.
 
und was bedeutet das dan?
wiviel abstand is das dan?
ein Tap abstand?
Wie soll ich das einfügen?
hab jetzt so Probiert:
Delphi-Quellcode:
RichEdit1.Lines.Insert(2,'      ' + Variable1 + #9 (Tab) + 'Text2' + 'Text3');
Dan kommt ein error, und so kommt nur der zeichensatz raus:
Delphi-Quellcode:
 
RichEdit1.Lines.Insert(2,'      ' + Variable1 + '#9 (Tab)' + 'Text2' + 'Text3');
Also wie muss ich das dazwischen einsetzten??

taaktaak 20. Mär 2008 09:31

Re: In eine Zeile vin einem Richtext mehrere texte einfügen.
 
Moin, Moin,
nur #9 einsetzen, nicht die im Text als Erklärung eingefügten Hinweis (TAB)

Power-Poler 20. Mär 2008 09:37

Re: In eine Zeile vin einem Richtext mehrere texte einfügen.
 
Also, ich weis nicht, wie mir das helfen soll, der Abstand ist nicht gross genaug, der dan erzeugt wird, also muss ich mehrere hintereinander setzten, und sobald die variable länger wird, wird der rest weiter verückt.
Delphi-Quellcode:
RichEdit1.Lines.Insert(2,'      ' + Variable1 + #9+ #9+ #9+ #9+ #9+ #9+ #9+ 'Text2' + 'Text3');
wenn in der Variable Beispielsweise Martin steht, geht es, aber sobal MartinMusterman drin steht, werden die Texte 2 und 3 trotzdem weiter gerückt.

taaktaak 20. Mär 2008 09:43

Re: In eine Zeile in einem Richtext mehrere texte einfügen.
 
Das ist verständlich, du musst natürlich den Tabulator auf einen passenden Wert setzen. Etwa so: Alle Einträge VOR dem Einfügen auf die Länge (in Pixeln) utersuchen, die Tabschrittweite setzen und erst dann einfügen.

Power-Poler 20. Mär 2008 09:50

Re: In eine Zeile in einem Richtext mehrere texte einfügen.
 
Und jetzt mal auf deutsch bitte, dan ich es auch verstehen kann :stupid:

:mrgreen:

taaktaak 20. Mär 2008 10:03

Re: In eine Zeile in einem Richtext mehrere texte einfügen.
 
In einer Schleife alle Einträge, die innerhalb einer Spalte stehen sollen, auf deren Länge untersuchen, der längste gefundene Wert+Freiraum ist dann dein Wert für den Tabulator der Spalte. Canvas hat eine Methode "TextWidth" - schau hierzu in die Hilfe.

Den Wert für den Tabulator setzt du mit Hilfe von SendMessage/PostMessage und EM_SETTABSTOPS, auch hierzu solltest du weitere Informationen finden.

Alternativ anstelle eines MEMOS/RICHEDITS vielleicht auch ein Stringgrid verwenden. Wenn keine Linien und keine FixedCols/FixedRows dargestellt werden, schaut das eigentlich genau so aus wie ein EditControl - damit dürfte das alles ein wenig einfacher sein. Sollen spezielle Textattribute verwendet werden, musst du das OnDraw des Grids dann selbst übernehmen.

Power-Poler 20. Mär 2008 11:05

Re: In eine Zeile in einem Richtext mehrere texte einfügen.
 
So, habe jetzt das hofenlich so, wie du es gemeint hast, mit der schleife das brauche ich nicht, da es keine Tabele in dem sin sein solte, mir geht es nur um einzele Zeilen.
Mein code sieht jetzt, für die ermitlung des Abstandes in px so aus:
Delphi-Quellcode:
Abstand1 := canvas.TextWidth('      ' + variable1);
Abstand2 := canvas.TextWidth('                                                                                                     ');
Abstand3 := Abstand2 - Abstand1;
Jetzt habe ich den px abstand in Abstand3 den ich brauche, also den zwischen variable 1 und Text2
wie sage ich jetzt aber dem tab, das er diesen abstand anhemen soll.
Dein bezug auf die Hilfe, ich denke mal du meinst die vom Delphi, die will bei mir irgenwie nicht, der meint immer das das file in meinem Projekt Order ligt, und das es da nicht ist, ist klar. Hab woll irgenwo nen fehler gemacht :oops:
Deswegen frage ich, befor ich vor verzweiflubg wider ein Projekt aufgebe, wäre nicht das erste, das ich angefangen habe, und das in die tonne getretten wurde, weil ich nicht weitergekommen bin. (Nicht nur in delphi)

Zugi 20. Mär 2008 11:50

Re: In eine Zeile in einem Richtext mehrere texte einfügen.
 
Hallo!

Ich würde auch zu einem StringGrid raten, das ist am einfachsten. Wenn Du es doch in einem RichEdit haben möchtest und das Setzen der Tabs Dir zu kompliziert erscheint, dann könntest Du vielleicht eine Schriftart mit fester Zeichenbreite nehmen(z.B. Courier). Dann in einer Schleife die maximale Anzahl der Zeichen je Spalte ermitteln (mit Length('Dein String')) und jeweils entsprechend viele Leerzeichen anhängen. Aber elegant ist das nicht!

Gruß,
Zugi

Power-Poler 20. Mär 2008 11:53

Re: In eine Zeile in einem Richtext mehrere texte einfügen.
 
taaktaak sagte etwas davon, das man die länger des Tab bestimmen kann, mit welchem befehl geht das?

Zitat:

Zitat von taaktaak
Den Wert für den Tabulator setzt du mit Hilfe von SendMessage/PostMessage und EM_SETTABSTOPS, auch hierzu solltest du weitere Informationen finden.

Aber irgenwie verstehe ich nicht, was ich jetzt in den code schreiben muss. :gruebel:

Die Muhkuh 20. Mär 2008 11:56

Re: In eine Zeile in einem Richtext mehrere texte einfügen.
 
Hi,

es geht Dir darum, Daten mehr oder weniger tabellarisch darzustellen?

Warum nutzt Du kein TStringGrid oder eine TListView?

Ein RichEdit für so etwas zu "missbrauchen" ist nicht gerade eine gute Alternative.

Power-Poler 20. Mär 2008 12:01

Re: In eine Zeile in einem Richtext mehrere texte einfügen.
 
Ich glaube ihr habt das falsch verstaden, ich will die Strings in keiner Tabele ausgeben, es ist schon richtig, das ich ein richtext nehme.
Bin über jede hilfe dankbar, aber von meiner entscheidung ein RichText zu verwänden, lasse ich micht nicht abringen.

Oben das:
Code:
Test1      Test2      Test3
Dieter1    Dieter2    Dieter3
und nicht so:
Test1      Test2      Test3
Dieter1      Dieter2      Dieter3
Das war nur ein Beispiel, so sieht das nachher nicht aus, das wahr nur zur erklärung, wie ich das meine, das halt die Position vom nächsten String nicht verändert werden darf, egal wie lang der vorhergehende ist.

DeddyH 20. Mär 2008 12:29

Re: In eine Zeile in einem Richtext mehrere texte einfügen.
 
Wenn Du eine Schriftart fester Breite verwendest, kannst Du auch die Textlängen ausrechnen und ggf. mit Leerzeichen auffüllen.

Zugi 20. Mär 2008 13:15

Re: In eine Zeile in einem Richtext mehrere texte einfügen.
 
Hallo!

OK, ganz auf die Schnelle, Quick'n'Dirty:

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ComCtrls;

type
  TForm1 = class(TForm)
    RichEdit1: TRichEdit;
    Edit1: TEdit;
    Edit2: TEdit;
    Edit3: TEdit;
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
  private
    { Private-Deklarationen }
    StringList1: TStringList;
    StringList2: TStringList;
    StringList3: TStringList;
    function GetMaxLength(StringList: TStringList): Integer;
    procedure AppendBlanks(var StringList: TStringList; nLength: Integer);
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  nCount: Integer;
  TabPixelPos1: Integer;
  TabPixelPos2: Integer;
begin
  StringList1.Add(Edit1.Text);
  StringList2.Add(Edit2.Text);
  StringList3.Add(Edit3.Text);

  TabPixelPos1 := GetMaxLength(StringList1);
  TabPixelPos2 := GetMaxLength(StringList2);

  RichEdit1.Clear;

  AppendBlanks(StringList1, TabPixelPos1);
  AppendBlanks(StringList2, TabPixelPos2);

  for nCount := 0 to StringList1.Count - 1 do
  begin
    RichEdit1.Lines.Add(StringList1[nCount] + ' ' + StringList2[nCount] + ' ' + StringList3[nCount]);
  end;

  RichEdit1.Repaint;
end;

function TForm1.GetMaxLength(StringList: TStringList): Integer;
var
  nCount: Integer;
  nLength: Integer;
begin
  nLength := 0;
  for nCount := 0 to StringList.Count - 1 do
  begin
    if nLength < Length(StringList[nCount]) then
      nLength := Length(StringList[nCount]);
  end;
  result := nLength;
end;

procedure TForm1.AppendBlanks(var StringList: TStringList; nLength: Integer);
var
  nCount: Integer;
begin
  for nCount := 0 to StringList.Count - 1 do
  begin
    while Length(StringList[nCount]) < nLength do
    begin
      StringList[nCount] := StringList[nCount] + ' ';
    end;
  end;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  StringList1 := TStringList.Create;
  StringList2 := TStringList.Create;
  StringList3 := TStringList.Create;
end;

procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  FreeAndNil(StringList1);
  FreeAndNil(StringList2);
  FreeAndNil(StringList3);
end;

end.
Du brauchst: 1 * TRichEdit, 1 * TButton, 3 * TEdit.

Hoffe das hilft.
Ach ja, nicht vergessen: im RichEdit den Font auf Courier stellen!

Gruß,
Zugi

DeddyH 20. Mär 2008 13:18

Re: In eine Zeile in einem Richtext mehrere texte einfügen.
 
So in der Art hatte ich das gemeint :)

Zugi 20. Mär 2008 13:22

Re: In eine Zeile in einem Richtext mehrere texte einfügen.
 
Ich in #12 auch schon :P

Gruß,
Zugi

DeddyH 20. Mär 2008 13:25

Re: In eine Zeile in einem Richtext mehrere texte einfügen.
 
Muss ich irgendwie übersehen haben :cyclops: .

Power-Poler 20. Mär 2008 13:30

Re: In eine Zeile in einem Richtext mehrere texte einfügen.
 
Wenn die Schrieft immer die gleiche breite hat, sieht das irgenwie nicht gut aus, die Seite soll ja schlieslich getruckt werden.
Was ich meine:
taaktaak sagte etwas davon, das man die länger des Tab bestimmen kann, mit welchem befehl geht das?

Zitat:

Zitat von taaktaak
Den Wert für den Tabulator setzt du mit Hilfe von SendMessage/PostMessage und EM_SETTABSTOPS, auch hierzu solltest du weitere Informationen finden.

Aber irgenwie verstehe ich nicht, was ich jetzt in den code schreiben muss. :gruebel

Und was ist in #12 auch schon??

Zugi 20. Mär 2008 13:50

Re: In eine Zeile in einem Richtext mehrere texte einfügen.
 
Hallo!

@DeddyH: Bist nicht der einzige :-D
@Power-Poler: In #12 hatte ich schon die "Lösung" mit den Leerzeichen skizziert.

So, wenn ich mich schon mal damit auseinandersetze:

Schau mal unter http://www.delphipraxis.net/internal...=emsettabstops

Bezieht sich zwar auf TMemo, ist aber Deinem Problem sehr ähnlich. Ausschnitt aus #13:
Zitat:

Delphi-Quellcode:
var
  ndx : integer;
  TabArray : Array [0..4] of integer;
begin
  Memo1.WantTabs := True;
  for ndx := 0 to 4 do
  begin
   TabArray[ndx] := 30 * ndx;
  end;
  SendMessage(Memo1.Handle,EM_SETTABSTOPS,5,LongInt(@TabArray));
end;

Dabei ist wohl zu beachten, dass als Einheit für die Tabs "Template Units" verwendet werden. mit Zeichenanzahl * 4 + Abstand sollte das funktionieren, habe ich aber nicht getestet.

Gruß,
Zugi

Power-Poler 20. Mär 2008 15:04

Re: In eine Zeile in einem Richtext mehrere texte einfügen.
 
Danke Leute :thumb:
Funktioniert jetzt ungefähr so wie ich mir das vorstehle.
Undgefähr weil: Bin doch auf Courier umgestiegen :wink:
Über px hat er doch irgenwie noch fehler gehabt mir dem abstand.


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