Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi tabstop rechtsbündig (https://www.delphipraxis.net/142729-tabstop-rechtsbuendig.html)

champagner 2. Nov 2009 19:23


tabstop rechtsbündig
 
Hallo,

ich habe folgenden Code:

Delphi-Quellcode:
procedure TAb_rechtsbuendig();
var
  pf2: PARAFORMAT2;
begin
  FillChar(pf2, SizeOf(pf2), 0);
  pf2.cbSize := SizeOf(pf2);
  pf2.dwMask := PFM_Tabstops;
  pf2.cTabCount:=5;
   pf2.rgxTabs[0]:=1440;
   pf2.rgxTabs[1]:=2880;
   pf2.rgxTabs[2]:=4000;
   pf2.rgxTabs[3]:=5000;
   pf2.rgxTabs[4]:=6000;


  SendMessage(form1.Richedit1.Handle, EM_SETPARAFORMAT, 0, Longint(@pf2));
end;
Ich möchte, dass die Tabstops rechtsbündig sind (also nicht der Text). D.h., wenn man mit der Tab-Taste weitergeht und Text eingibt, verschiebt sich dieser nach links (s. OpenOffice Writer, auf Tabstop doppelt klicken).

name 1
name 12

und eben nicht:

name 1
name 12

Hat jemand eine Idee? Ich bin ein Newbie mit den API-Geschichten.

Danke!

[edit=Matze][delphi]-Tags eingefügt. MfG, Matze[/edit]

himitsu 2. Nov 2009 19:39

Re: tabstop rechtsbündig
 
bitte benutze mal diese [delphi]...[/delphi]-Tags
sowie [code]...[/code] für dein Beispiel (die Leerzeichen sind sonst sinnlos)
du kannst deinen Beitrag auch noch editieren und dieses ändern ... einfach auf [edit] klicken


und für WinAPI-Sachen
MSDN-Library durchsuchenEM_SETPARAFORMAT

dort klickst du dich zum passenden Eintrag durch
http://msdn.microsoft.com/en-us/library/bb774276.aspx
da geht es dann weiter mit den Records (sind da verlinkt)
http://msdn.microsoft.com/en-us/library/bb787942.aspx

und dort steht wiederum was man wie setzen muß, damit das gewünschte passiert.
siehe rgxTabs

champagner 2. Nov 2009 19:46

Re: tabstop rechtsbündig
 
Hallo,

sorry, werde mich zukünftig daran halten.

Wäre es möglich, ein bisschen Quellcode zu erhalten? Ich habe nämlich leider wirklich nicht so viel Ahnung; es wäre aber wichtig für mich, dieses Problem mit den Tabstops zu lösen...

VIELEN Dank!

himitsu 2. Nov 2009 19:58

Re: tabstop rechtsbündig
 
den Quellcode hast du schon
und was du genau ändern mußt, das steht im MSDN
Delphi-Quellcode:
pf2.rgxTabs[1] := 2880 or ...;
... = hier jetzt die Werte dazurechnen, welche da drüben erwähnt wurden


Aber vermutlich hast du eh pech und es geht bei dir nicht.
Du hast ja nicht erwähnt welche Delphi-Version und welches OS du nutzt.
Zitat:

These bits do not affect the rich edit control display for versions earlier than Rich Edit 3.0.

champagner 2. Nov 2009 20:10

Re: tabstop rechtsbündig
 
Hallo,

vielen Dank.

Ich habe TurboDelphi und Windows Vista.

Den Wert hinter dem "or", ist das der Wert "2" für "right aligned tab"? oder muss ich dort $2000000 eintragen?


Vielen Dank!

champagner 2. Nov 2009 20:12

Re: tabstop rechtsbündig
 
Ach ja, und wie genau funktioniert das mit dem 24-27 bit?

himitsu 2. Nov 2009 20:19

Re: tabstop rechtsbündig
 
Delphi-Quellcode:
pf2.rgxTabs[1] := 2880 or (2{rechts} shl 24);

pf2.rgxTabs[1] := 2880 or $02000000;
$0x000000 = Bits 24-27
$x0000000 = Bits 28-31

champagner 2. Nov 2009 20:34

Re: tabstop rechtsbündig
 
Vielen, vielen Dank!

champagner 3. Nov 2009 21:30

Re: tabstop rechtsbündig
 
Ich habe jetzt folgenden Quelltext entworfen:

Delphi-Quellcode:
unit Paraformat_Beispiel;

interface

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

type
  TForm1 = class(TForm)
    RichEdit1: TRichEdit;

    procedure FormCreate(Sender: TObject);
  private
    { Private-Deklarationen } 
  public
    { Public-Deklarationen } 
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm} 


procedure TForm1.FormCreate(Sender: TObject);
var
  pf2 : PARAFORMAT2;
  i  : Integer;
begin
  SendMessage(Richedit1.Handle, EM_GETPARAFORMAT, 0, Longint(@pf2));// brauche ich das? 
  FillChar(pf2, SizeOf(pf2), 0); // brauche ich das? 
  pf2.cbSize  := SizeOf(pf2);
  pf2.dwMask := PFM_Tabstops;
  pf2.cTabCount :=5;
  pf2.rgxTabs[0]:=1440;
  pf2.rgxTabs[1]:=2880 or $02000000;
  pf2.rgxTabs[2]:=4000;
  pf2.rgxTabs[3]:=5000;
  pf2.rgxTabs[4]:=6000;

  SendMessage(Richedit1.Handle, EM_SETPARAFORMAT, 0, Longint(@pf2));
end;

end.
Das Setzen der Tabstops funktioniert offenbar bestens. Leider funktioniert nicht, dass das Tab [1] rechtsbündig ist.

Bitte: Was fehlt an meinem Quellcode? Mein System: Vista, Turbodelphi.

Vielen Dank!

champagner 5. Nov 2009 19:22

Re: tabstop rechtsbündig
 
Hallo,

kann mir irgendwer helfen? Danke!

Lannes 6. Nov 2009 09:17

Re: tabstop rechtsbündig
 
Hallo,

ich zitiere noch mal ...
Zitat:

Zitat von himitsu
... Aber vermutlich hast du eh pech und es geht bei dir nicht.
Du hast ja nicht erwähnt welche Delphi-Version und welches OS du nutzt.
Zitat:

These bits do not affect the rich edit control display for versions earlier than Rich Edit 3.0.

das RichEdit ist eine Wrapperklasse auf die Richedit-dll des OS
Auch die Wrapperklasse in TurboDelphi unterstützt nur RichEdit 2.0. und wenn ich das Link lese ist es bei D2009 auch nicht anders.
Zitat:

Zitat von Embarcadero
TRichEdit supports Rich Edit 2.0.

Ich würde mir mal das rtflabel näher anschauen, die Komponente benutzt RichEdit 3.0 und 4.1:
Flocke's Garage

himitsu 6. Nov 2009 10:08

Re: tabstop rechtsbündig
 
Ob nun Richedit 2 oder 3 verwendet wird, liegt auch mit am Windows, bzw. der initialisierten Common-Controls.


Der Windows-Fensterklassenname für v2 und v3 ist gleich und was nun genommen wird hängt dann nur noch von den Common-Controls ab.

Klar hat Delphi nur die Schnittstellen für v2 und unterstützt IDE-seitig nicht mehr, aber das RichEdit kann es ja dennoch.
Also kann man in soeinem Fall auch die RichEdit3-Befehle verwenden.

sirius 6. Nov 2009 10:21

Re: tabstop rechtsbündig
 
In D7 wird aber noch Version 1 verwendet (Riched32.dll)

himitsu 6. Nov 2009 10:26

Re: tabstop rechtsbündig
 
Jupp, durm ja die Frage nach Delphi und OS

Delphi > welche Windows-Fensterklasse wird zum Erstellen genommen
Delphi > mit oder ohne Manifest und welche CommonControls wurden initialisiert
OS > was steht überhaupt zu Verfügung

champagner 6. Nov 2009 10:44

Re: tabstop rechtsbündig
 
Hallo,

mein OS ist Windows Vista Home Premium mit allen Updates.

Ich habe Turbo Delphi (ca. 2 Jahre alt); ich habe das xp-manifest "installiert".

Wie checke ich, welche Common-controls initialisiert wurden?

Frage: Würde es laufen, wenn ich Delphi 2010 hätte?

Lannes 6. Nov 2009 11:13

Re: tabstop rechtsbündig
 
Hallo,

Zitat:

Zitat von himitsu
Klar hat Delphi nur die Schnittstellen für v2 und unterstützt IDE-seitig nicht mehr, aber das RichEdit kann es ja dennoch.
Also kann man in soeinem Fall auch die RichEdit3-Befehle verwenden.

und auch Version 4.1, deshalb mein Hinweis auf Flockes rtflabel

Zitat:

Zitat von sirius
In D7 wird aber noch Version 1 verwendet (Riched32.dll)

mit dem einbinden der Unit RichEdit in uses dann auch 2.0
Das ist schon ab D3 so.

champagner 6. Nov 2009 21:05

Re: tabstop rechtsbündig
 
Hallo,

ich habe jetzt folgendes eingefügt:

LoadLibrary('msftedit.dll');


Und da hat es irgenwie auch teilweise EINMAL funktioniert. Jetzt aber nicht mehr. Schade.


Noch einen Tipp parat?

himitsu 6. Nov 2009 21:28

Re: tabstop rechtsbündig
 
Das Problem ist halt, das die delphieigene VCL-Komponente erstmal nur "mindestens" ein Richedit 2.0 anfordert.
Und ob es nun ein 2.0 oder ein 3.0 bekommt, daß hängt nun von mehreren faktoren ab, auf welche du garnicht sso genau Einfluß nehmen kannst.

Allerdings sind die gewünschten Funktionalitäten nur mindestestens in einem 3 enthalten
(besser wäre ein 4 oder gar 5, da diese eigenständige Windowskomponenten sind ... nicht so wie 2 und 3)

champagner 4. Jan 2010 20:00

Re: tabstop rechtsbündig
 
Hallo,

und wie kann ich ein "Dreier" laden lassen?

Ich habe jetzt Delphi 2010, Windows 7. Sollte es damit funktionieren?

Danke!


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:30 Uhr.

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