Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi RichEdit und Zeilenumbruch (https://www.delphipraxis.net/145178-richedit-und-zeilenumbruch.html)

DelTurbo 25. Dez 2009 14:06


RichEdit und Zeilenumbruch
 
Hi,

ich habe ein kleines problem. Ich möchte das RichEdit den text nicht nur an einem Space umbricht sondern auch an anderen zeichen. Kann man das irgendwo einstellen? ca. 1 Stunde google hat mich nicht weitergebracht.

Danke im voraus

Niko 25. Dez 2009 15:22

Re: Frage zu RichEdit
 
Hi,

meines Wissens hat TRichEdit keine entsprechende Eigenschaft. Es sollte sich aber umsetzen lassen, in dem du über die Nachricht MSDN-Library durchsuchenEM_SETWORDBREAKPROC eine entsprechende Callbackfunktion installierst.

DelTurbo 25. Dez 2009 15:41

Re: Frage zu RichEdit
 
Oh gott, sowas hab ich noch nie gemacht. Also ich habe rausgefunden das er bei Space und - einen wrap macht. Mir fehlt nur der punkt :(

Eventuell mal dran denken das ich erst seit ca. 2 Wochen Programmiere (unter Windows)..... Also seitdem ich hier angemeldet bin ^^

Wenn ich hier mal was frage, dann hänge ich echt in der kurve und komme nicht weiter. Ansonsten wühle ich mich durch. Im moment mache ich einen kleinen irc-client. Der rennt auch schon nachdem ich die idirc.pas geändert habe. Die geänderte unit hab ich natürlich hier hochgeladen (ich hoffe das ist erwünscht), damit andere nicht über den selben fehler stolpern. Und für den irc-client bräucht ich den umbruch....

Kann man denn wielliecht RichEdit dazu bringen einfach umzubrechen wenn er am ende ist??? Egal welches zeichen dort steht. Das wäre auch genial......

Gruss und danke

DelTurbo 25. Dez 2009 18:54

Re: Frage zu RichEdit
 
Ich möchte gleich noch eine frage hinterherschieben ;)

Und zwar habe ich grad mal versucht mit TabControl zu arbeiten. Leider scheint es so, das wenn RichEdit.Visible:=False ist, das alles nichtmehr richtig arbeitet wenn ich trotzdem weiter daten da reinschreibe.

Gibt es da einen trick???

Danke

Niko 25. Dez 2009 19:59

Re: Frage zu RichEdit
 
Weil Weihnachten ist (und es mich selbst interessiert hat ...):

Automatische Zeilenwechsel werden an Zeichen aus WhitespaceChars und aus DelimiterChars durchgeführt. Die Implementierung ist nicht ganz perfekt: Wortweise springen nach Links mit Strg + Pfeiltaste verhält sich nicht ganz Standardkonform, aber ich hatte jetzt nicht mehr Zeit.

Delphi-Quellcode:
 // Fehlende Definitionen ergänzen
const
  WB_CLASSIFY = 3;
  WB_MOVEWORDLEFT = 4;
  WB_MOVEWORDRIGHT = 5;
  WB_LEFTBREAK = 6;
  WB_RIGHTBREAK = 7;

  WB_CLASS_WHITESPACE = 0;
  WB_CLASS_LINEBREAK = 1;
  WB_CLASS_DELIMITER = 2;
  WB_CLASS_NORMALCHAR = 3;

  WBF_CLASS = $0F;
  WBF_ISWHITE = $10;
  WBF_BREAKLINE = $20;
  WBF_BREAKAFTER = $40;

// Zeichengruppen
const
  WhitespaceChars: set of Char = [#9, #32];
  LinebreakChars: set of Char = [#10, #13];
  DelimiterChars: set of Char = [#9, #32, #13, '.', '-'];

function EditWordBreakProc(lpch: LPTSTR; ichCurrent: Integer; cch: Integer;
  code: Integer): Integer; stdcall;
begin
  case code of
    WB_CLASSIFY:
      if lpch[ichCurrent] in WhitespaceChars then
        Result := WBF_ISWHITE or WB_CLASS_WHITESPACE
      else if lpch[ichCurrent] in LinebreakChars then
        Result := WBF_BREAKLINE or WB_CLASS_DELIMITER
      else if lpch[ichCurrent] in DelimiterChars then
        Result := WBF_BREAKAFTER or WB_CLASS_DELIMITER
      else
        Result := WB_CLASS_NORMALCHAR;
    WB_ISDELIMITER:
      if (lpch[ichCurrent] in DelimiterChars) then
        Result := 1
      else
        Result := 0;
    WB_LEFT, WB_MOVEWORDLEFT:
      begin
        Dec(ichCurrent);
        while (ichCurrent >= 0) and (lpch[ichCurrent] in DelimiterChars) do
          Dec(ichCurrent);
        while (ichCurrent >= 0) and not (lpch[ichCurrent] in DelimiterChars) do
          Dec(ichCurrent);
        Result := ichCurrent + 1;
      end;
    WB_LEFTBREAK:
      begin
        Dec(ichCurrent);
        while (ichCurrent >= 0) and not (lpch[ichCurrent] in DelimiterChars) do
          Dec(ichCurrent);
        if ichCurrent < 0 then
          ichCurrent := 0;
        Result := ichCurrent;
      end;
    WB_RIGHT, WB_MOVEWORDRIGHT:
      begin
        while (ichCurrent < cch) and not (lpch[ichCurrent] in DelimiterChars) do
          Inc(ichCurrent);
        while (ichCurrent < cch) and (lpch[ichCurrent] in DelimiterChars) do
          Inc(ichCurrent);
        Result := ichCurrent;
      end;
    WB_RIGHTBREAK:
      begin
        Inc(ichCurrent);
        while (ichCurrent < cch) and not (lpch[ichCurrent] in DelimiterChars) do
          Inc(ichCurrent);
        Result := ichCurrent;
      end;
  end;
end;

procedure TForm2.FormCreate(Sender: TObject);
begin
  // Eigene Zeilenumbruchfunktion aktivieren
  SendMessage(RichEdit1.Handle, EM_SETWORDBREAKPROC, 0, Integer(@EditWordBreakProc));
end;
Gib deinem Thread bitte noch einen etwas aussagekräftigeren Titel und mach für die zweite Frage einen neuen auf. Sonst findet das später keiner mehr, der vielleicht mal vor dem gleichen Problem steht. Danke. :-)

Luckie 25. Dez 2009 20:00

Re: Frage zu RichEdit
 
Zitat:

Zitat von DelTurbo
Ich möchte gleich noch eine frage hinterherschieben ;)

Aber bitte in einem neuen Thread.

DelTurbo 26. Dez 2009 10:25

Re: Frage zu RichEdit
 
Zitat:

Zitat von Luckie
Zitat:

Zitat von DelTurbo
Ich möchte gleich noch eine frage hinterherschieben ;)

Aber bitte in einem neuen Thread.

Sorry, Ich wollte nicht so viele Threads auf einmal machen. Aber wenn ich drüber nachdenke, es ist natürlich schwachsinn hier nach den tabs zu fragen. Aber das ist ein Projekt bei mir. Hab nicht drüber nachgedacht (ich denke eher selten ;) )

@Niko, tausend dank für dein "geschenkt". Ich werde mal versuchen das reinzubekommen. Das mit dem Edit ist egal. Die box ist ReadOnly.

LG

DelTurbo 26. Dez 2009 11:13

Re: RichEdit und Zeilenumbruch
 
Rückmeldung: GEIL, klappt super. Nochmal tausend dank. Das hät ich in der zeit nicht hinbekommen. Eventuell nach 3 Tagen googln.

Nochmal danke...

Gruss


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