TMemo

Für Fragen von Einsteigern und Programmieranfängern...
hbr
Beiträge: 321
Registriert: Mi 20. Feb 2013, 10:30
OS, Lazarus, FPC: Win (L 2.2.4 FPC 3.2.2)
CPU-Target: 32/64,ARM(RPi)

TMemo

Beitrag von hbr »

Hallo,
gibt es eine Möglichkeit das selektiere in einem Memofeld abzuschalten?
oder das Kopieren mit Ctr+ C.
ReadOnly steht auf true.

Enabled muss aber auf true stehen, damit die ScrollBars funktionieren.
Gruß

wp_xyz
Beiträge: 5154
Registriert: Fr 8. Apr 2011, 09:01

Re: TMemo

Beitrag von wp_xyz »

Bist du sicher, dass deine Benutzer nicht irgendwann auf die Idee kommen könnten, sich einen Teil des im Memo dargestellten Textes für ein anderes Programm in die Zwischenablage zu kopieren? Immer wenn ich in meinen eigenen Programmen solche Ideen hatte, musste ich das bald aus genau diesem Grund rückgängig machen.

Ansonsten könntest du in den KeyDown, KeyUp, MouseDown, MouseMove-Events des Memo dessen SelLength auf 0 setzen.

hbr
Beiträge: 321
Registriert: Mi 20. Feb 2013, 10:30
OS, Lazarus, FPC: Win (L 2.2.4 FPC 3.2.2)
CPU-Target: 32/64,ARM(RPi)

Re: TMemo

Beitrag von hbr »

wp_xyz hat geschrieben:Bist du sicher, dass deine Benutzer nicht irgendwann auf die Idee kommen könnten, sich einen Teil des im Memo dargestellten Textes für ein anderes Programm in die Zwischenablage zu kopieren? Immer wenn ich in meinen eigenen Programmen solche Ideen hatte, musste ich das bald aus genau diesem Grund rückgängig machen.

Ansonsten könntest du in den KeyDown, KeyUp, MouseDown, MouseMove-Events des Memo dessen SelLength auf 0 setzen.
Schon klar, funktioniert trotzdem nicht.


OK!
Geht doch, Danke.

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: TMemo

Beitrag von pluto »

Warum soll der Nutzer nicht was raus kopieren können?

Mir fällt kein Grund dazu ein.
MFG
Michael Springwald

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: TMemo

Beitrag von pluto »

Code: Alles auswählen

Memo1.SelStart:=0;
    Memo1.SelLength:=0;
    Memo1.SelText:='';
Bei den Events: onMouseMove, OnMouseUp, OnMouseUp und soweiter und man kann nicht mehr Markieren.
MFG
Michael Springwald

SoE
Beiträge: 84
Registriert: Mo 31. Aug 2015, 01:51

Re: TMemo

Beitrag von SoE »

Code: Alles auswählen

 
Unit uMemoCheck;
 {$mode objfpc}{$H+}
Interface
 Uses
  Windows, Messages, Classes, SysUtils, FileUtil, Forms, Controls, Graphics, StdCtrls;
 
 Type
  TForm1 = Class(TForm)
 
   Memo1: TMemo;
    Procedure FormCreate    (Sender: TObject);
    Procedure FormKeyDown   (Sender: TObject;  Var Key: Word; Shift: TShiftState);
 
     Private
      FWndProc: TWndMethod;
      Procedure MemoWndProc (Var MSG: TMessage);
  End;
 
 Var
  Form1: TForm1;
Implementation
 {$R *.lfm}
 
Procedure TForm1.MemoWndProc(Var MSG: TMessage);
 Begin
  If   MSG.Msg = WM_SETFOCUS
  Then HideCaret(Memo1.Handle)
  Else FWndProc (MSG);
 End;
 
Procedure TForm1.FormKeyDown(Sender: TObject; Var Key: Word; Shift: TShiftState);
 Begin
  If Sender = Memo1
  Then
   Begin
    //Key:= 0;
    //oder
    If ssCTRL In Shift Then Key:= 0; //falls CTRL nicht benötigt wird...
  End;
 End;
 
Procedure TForm1.FormCreate(Sender: TObject);
 Begin
  FWndProc        := Memo1.WindowProc;
  Memo1.WindowProc:= @MemoWndProc;
 End;
 
End.                          
 
Ich wollte gerade schreiben, dass das hier sehr gut funktioniert, dann ist mir jedoch aufgefallen, dass das nur unter D7 funzt.
In D7 ist es dann nicht mehr möglich Text zu selektieren und der Cursor ist auch gleich weg...
Bei Lazarus geht das leider nicht... Der Cursor ist natürlich weg, aber man kann immer noch Text auswählen.

Eigentlich reicht schon das hier aus "Memo1.SelLength:= 0;", aber das ist keine gute Lösung, da man immer noch etwas von der Markierung sieht und es flackert wie bekloppt...

SoE
Beiträge: 84
Registriert: Mo 31. Aug 2015, 01:51

Re: TMemo

Beitrag von SoE »

Was auf jeden Fall funzt ist:

Nimm eine TScrollBox oder ein TPanel und dazu Labels....
Damit kann man auch gleich noch 'nen Schatten simulieren...
grins...

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: TMemo

Beitrag von pluto »

Er könnte auch ganz einfach eben schnell ein eigenen klein Text-Render-Engine Bauen mit einigen netten Extras.
Ist gar nicht so Aufwendig.....Innerhalb von 4 Wochen kann man soweit sein.
MFG
Michael Springwald

SoE
Beiträge: 84
Registriert: Mo 31. Aug 2015, 01:51

Re: TMemo

Beitrag von SoE »

Text-Render-Engine Bauen
Ach was? Echt ? Von was für einer Basis sprichst du denn hier? OpenGL ??
Gibt es dazu brauchbare EinsteigerTutorials... irgendwo ??

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: TMemo

Beitrag von pluto »

Ach was? Echt ? Von was für einer Basis sprichst du denn hier? OpenGL ??
Gibt es dazu brauchbare EinsteigerTutorials... irgendwo ??
Eigentlich war das eher ein Scherz, aber bitte:
Nimm TCanvas.
Nimm eine TStringlist

Code: Alles auswählen

 
var
  px,py:Integer;
begin
  px:=0;
  py:=0;
  for i:=0 to Stringlist.Count-1 do begin
    Canvas.Textout(px,py,Stringlist[i]);
    py:=py+Canvas.TextHeight(StringList[i]);
  end;
 
In der einfachen Form. Es könnten sein, dass hier Rechtschreibfehler drin sind. Aber sonst wäre es Langweilig....
Das kann man jetzt noch ausbauen.
Meine Strukturen sahen zu letzt etwas anders aus, aber für den Anfang sollte das reichen.

Ich kann man schauen, ob ich ein erweitertes Beispiel entwickeln kann. Wo du auch Scrollen kannst. Es geht darum, einfach nur Text Anzuzeigen, ohne besonders Extras?
MFG
Michael Springwald

SoE
Beiträge: 84
Registriert: Mo 31. Aug 2015, 01:51

Re: TMemo

Beitrag von SoE »

Wo du auch Scrollen kannst.
Deswegen dachte ich eher an ein Panel und TLabel Array. (Array Of Array[0..1] Of TLabel)..
Die Dinger kann man leicht und sauber scrollen wenn man direkt scrollt über Top und Left und dazu auch noch seitenweise (ClientHeight).
ScrollBy schmiert bei D7 und 'nem Panel oder 'ner ScrollBox.. hab' ich mit Lazarus bis jetzt noch nicht getestet...

Und wenn man mal 'ne Zeile anklicken muß, dann kann man das per Sender leicht machen.
Oder mal 'ne Farbe ändern..

Ich hab' echt gedacht man könnte das recht einfach mal irgendwie bauen... Deine RenderEngine... na toll.... :-)

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: TMemo

Beitrag von pluto »

Bin dabei... Ich denke morgen werde ich soweit sein... Text kann ich bereits anzeigen...
MFG
Michael Springwald

pluto
Lazarusforum e. V.
Beiträge: 7192
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: TMemo

Beitrag von pluto »

Ein erweitertes Beispiel, morgen kann ich es noch etwas erweitern.

Ein Anwendung Beispiel ist dabei. Du kannst Scrollen und einfachen Text da stellen. Mit ein paar einfachen Regeln könnte man den Text auch noch Formatieren. Problematisch wird es nur bei unterschiedlichen Schrift Größen.

Unterschiedliche Schrift Farben und so, wäre kein Problem.
Dateianhänge
plTextEngine.zip
(127.87 KiB) 81-mal heruntergeladen
MFG
Michael Springwald

SoE
Beiträge: 84
Registriert: Mo 31. Aug 2015, 01:51

Re: TMemo

Beitrag von SoE »

Hey, cool... funzt gut...
Unterschiedliche Schriftgröße finde ich nicht so wichtig...
Farbe und WelcheZeileWurdeGeklickt wäre interessant, aber ich muß mir erstmal die Details anschauen...

Hmm, Mist ich muß weg... heute Abend vielleicht...

SoE
Beiträge: 84
Registriert: Mo 31. Aug 2015, 01:51

Re: TMemo

Beitrag von SoE »

@pluto:
Danke für den Code...
Hatte bis jetzt nur kurz Zeit 'nen Blick drauf zu werfen...

Ich hab' 'ne Kantenglättung eingebaut und die Schriftgröße verändert. Jetzt kann man nur noch von 0 - 265 scrollen...
Das Scrollen sieht sauber aus, kann kein Schmieren erkennen.
DoubleBuffered scheint gegen das Flackern nicht zu wirken, wohl wegen dem direkten Canvas Paint...

Für 'ne Liste hatte ich bis jetzt noch nicht direkt auf das Canvas gezeichnet. Viele sagen man soll lieber gleich GDI+ benutzen oder OpenGL...
Deswegen hab' ich immer Komponenten benutzt.

Nochmal besten Dank, macht Spass damit 'rumzuspielen... heute Abend hab' ich wahrscheinlich mehr Zeit..

Antworten