Delphi-PRAXiS

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/)
-   -   Einzelne Lines im Memo einrücken (https://www.delphipraxis.net/165712-einzelne-lines-im-memo-einruecken.html)

Jumpy 12. Jan 2012 14:04

Einzelne Lines im Memo einrücken
 
Hallo,

kann hier wer mal drüber gucken, ob das irgendwie eleganter geht?
Ziel ist es in einem Memo die Zeilen, die selektiert sind mit "--" einzurücken bzw. "zurückzurücken". Dabei soll es egal sein, wo in einer Zeile die Selektion anfängt/aufhört.
Dies soll dem auskommentieren und einrücken mancher IDE's nachempfunden sein.

Delphi-Quellcode:
procedure TSelector.acDecommentExecute(Sender: TObject);
var i:Integer;
begin
  for i:=Startline to Endline do
    if Pos('--',SelectMemo.Lines[i])=1 then
      SelectMemo.Lines[i]:=Copy(SelectMemo.Lines[i],3,Length(SelectMemo.Lines[i]));
end;

procedure TSelector.acCommentExecute(Sender: TObject);
var i:Integer;
begin
  for i:=Startline to Endline do
    SelectMemo.Lines[i]:='--'+SelectMemo.Lines[i];
end;

function TSelector.Endline: Integer;
var
  i,l:Integer;
  endfound: Boolean;
begin
  endfound := false;
  l:=0;
  Result:=0;
  for i:=0 to SelectMemo.Lines.Count-1 do
    begin
    l:=l+Length(SelectMemo.Lines[i])+2;
    if not endfound then
      begin
      if l>=SelectMemo.SelStart+SelectMemo.SelLength then
        begin
        endfound:=true;
        result:=i;
        end;
      end;
    end;
end;

function TSelector.Startline: Integer;
var
  i,l:Integer;
  startfound: Boolean;
begin
 startfound := false;
  l:=0;
  Result:=0;
  for i:=0 to SelectMemo.Lines.Count-1 do
    begin
    l:=l+Length(SelectMemo.Lines[i])+2;
    if not startfound then
      begin
      if l>SelectMemo.SelStart then
        begin
        startfound:=true;
        result:=i;
        end;
      end
    end;
end;

DeddyH 12. Jan 2012 14:12

AW: Einzelne Lines im Memo einrücken
 
StartLine und Endline könnten vielleicht eleganter mit EM_LINEFROMCHAR gelöst werden. Ansonsten würde ich noch BeginUpdate/EndUpdate beim Manipulieren der Zeilen einbauen. Mehr fällt mir nach einem flüchtigen Blick nicht auf.

Jumpy 12. Jan 2012 16:09

AW: Einzelne Lines im Memo einrücken
 
Zitat:

Zitat von DeddyH (Beitrag 1145644)
StartLine und Endline könnten vielleicht eleganter mit EM_LINEFROMCHAR gelöst werden. Ansonsten würde ich noch BeginUpdate/EndUpdate beim Manipulieren der Zeilen einbauen. Mehr fällt mir nach einem flüchtigen Blick nicht auf.

Schau ich mir morgen mal genauer an, sieht auf jeden Fall eleganter aus.

Ansonsten ist im obigen Code/Vorgehen noch irgendwo ein logischer Fehler drin. Wenn ohne Selection der Cursor (oder aber bei Selection SelStart am Anfang (oder Ende?) einer Zeile steht, wird fälschlicherweise schonmal die vorherige Zeile mit eingerückt.

Muss ich ggf. morgen mal experimentieren oder evolutionieren woran das liegen könnte.


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