Seite 1 von 1

EditorGadget frage...

Verfasst: 13.08.2008 22:17
von dreamer
Hallo,
ist es eigentlich irgendwie möglich Text an der Cursor-Position einfügen zu lassen?
Man kann ja nur in eine neue Zeile entweder am Anfang oder hinten dran Text einfügen lassen.

Sorry, weiß nicht ob ich mich klar genug ausdrücke.

Was ich machen möchte: ich hab schon einiges an Text im EditorGadget stehen.
Nun möchte ich irgendwo innerhalb des Textes mit dem Cursor hin springen und z.B. wenn ich auf die Taste "Hallo" drücke, soll er genau an dieser Stelle "Hallo" eifügen.
So oder so ähnlich.

Verfasst: 14.08.2008 08:22
von Shardik
netmaestro hat im englischen Forum gezeigt, wie man einen Text an einer bestimmten Position im EditorGadget einfügt:
http://www.purebasic.fr/english/viewtop ... 83&start=4
Thorsten1867 hat in einem Beitrag gezeigt, wie man die aktuelle Cursor-Position im EditorGadget ermittelt:
http://www.purebasic.fr/german/viewtopi ... 75&start=3

Verfasst: 14.08.2008 09:20
von Shardik
Ich habe zum besseren Verständnis die beiden oben zitierten Programme vereinfacht und in einem einzigen kurzen Programm zusammengefaßt:

Code: Alles auswählen

If OpenWindow(0, 0, 0, 340, 140, "Text an Cursor-Position einfügen", #PB_Window_SystemMenu | #PB_Window_ScreenCentered) And CreateGadgetList(WindowID(0)) 
  EditorGadget(0, 0, 0, 340, 100, #ES_MULTILINE)
  ButtonGadget(1, 110, 110, 100, 20, "'Hallo! ' einfügen") 
  SetGadgetText(0, "Beim Programmieren mit C habe ich gelernt, Bugs zu produzieren." + #CR$ + "Seit ich C++ benutze, kann ich die Bugs sogar vererben ;-)") 
  SetActiveGadget(0)

  Repeat
    WindowEvent = WaitWindowEvent()

    Select WindowEvent 
      Case #PB_Event_Gadget 
        Select EventGadget() 
          Case 1 
            SetActiveGadget(0)
            SendMessage_(GadgetID(0), #EM_EXGETSEL, 0, Range.CHARRANGE)
            SendMessage_(GadgetID(0), #EM_SETSEL, Range\cpMin, Range\cpMin)
            SendMessage_(GadgetID(0), #EM_REPLACESEL, 1, @"Hallo! ")
          EndSelect 
      EndSelect
  Until WindowEvent = #PB_Event_CloseWindow
EndIf

Verfasst: 14.08.2008 21:17
von dreamer
ok, das herausfinden der Cursor-Position hat mir weiter geholfen.
Klappt jetzt. :D

Verstehe aber leider nix von dem Code. :cry:
Windows-API, richtig?

Da muß ich mich mal durchwuseln. Sieht wahrscheinlich komplitzierter aus als es ist.

Danke für die Hilfe.

Verfasst: 15.08.2008 08:43
von Shardik
>>Windows-API, richtig?
Korrekt. In PureBASIC sind sehr viele Windows API (Application Programming Interface) Funktionen schon vordefiniert. Man erkennt API-Funktionen in PB am nachgestellten Unterstrich wie in SendMessage_(...). Wenn man in seinem PB-Installationsverzeichnis den Ordner Help anlegt und dort die Hilfe-Datei Win32.Hlp (http://www.purebasic.com/download/WindowsHelp.zip) hineinkopiert, kann man sogar über die F1-Taste direkt die Beschreibung zu einer API-Funktion erhalten. Allerdings ist die 24 MByte große Win32.Hlp mittlerweile veraltet. Profis installieren sich daher das Microsoft Platform SDK, das allerdings entpackt je nach installiertem Umfang mehrere GByte Platz in Anspruch nimmt. Beschrieben ist dies alles unter diesem PB-Link:
http://www.purebasic.com/german/documen ... _help.html
Wenn man das Platform SDK nicht installieren möchte, kann man aber auch alle API-Funktionen, die in Win32.Hlp fehlen, über eine Google-Suche ermitteln und dort den entsprechenden Microsoft MSDN-Eintrag anklicken.

>>Verstehe aber leider nix von dem Code. :cry:
Dem kann man abhelfen:

Code: Alles auswählen

SendMessage_(GadgetID(0), #EM_EXGETSEL, 0, Range.CHARRANGE)
bewirkt, daß Windows eine CHARRANGE-Struktur zurückliefert. Diese Struktur kann man in der PB-IDE nachschlagen, wenn man auf "Werkzeuge/Strukturverzeichnis" klickt, den Karteireiter "Strukturen" aktiviert, unter dem Buchstaben "C" den Eintrag "CHARRANGE" sucht und einen Doppelklick auf diesen Eintrag ausführt. Kurz gesagt liefert diese Struktur die Start- und Ende-Position eines markierten Bereiches im EditorGadget.

Code: Alles auswählen

SendMessage_(GadgetID(0), #EM_SETSEL, Range\cpMin, Range\cpMin)
Diese Funktion wählt einen Bereich im EditorGadget aus, in dem die nächste Aktion stattfinden soll. Range\cpMin ist die Position aus der CHARRANGE-Struktur, an der der Cursor augenblicklich steht, bzw. der Beginn eines markierten Bereiches.

Code: Alles auswählen

SendMessage_(GadgetID(0), #EM_REPLACESEL, 1, @"Hallo! ")
Mit dieser Funktion wird der zuvor spezifizierte Bereich durch die angegebene Zeichenkette "Hallo! " ersetzt, in diesem Falle lediglich eingefügt.
Das war's eigentlich schon. Bei weiteren Verständnisproblemen bitte einfach noch einmal nachfragen... :wink:

Re: EditorGadget frage...

Verfasst: 08.12.2020 20:37
von Speedy
Na, das sieht doch schon mal brauchbar aus. Aber bei mir wird es jetzt etwas schwierig.
Ich möchte aus dem Editor den Text mit Farbe, Größe, Fonts usw. entnehmen und in einen anderen Editor in HTML Code umwandeln

Also ich schreibe im Editor zB. in Rot "Verkaufe" und in einer anderen Farbe z.B. "Socken"
Nun muss das in einen anderen Editor gleichzeitig in HTML-Code umgewandelt werden.

<p><font color='#FF0000' font-size='8' font-face='Arial'>Verkaufe</font></p>
<p><font color='#FF00FF' font-size='8' font-face='Arial'>Socken</font></p>

Für Eure Hilfe und Vorschläge bin ich Euch sehr Verbunden...

Im übrigen, das Einfärben von Text im Editor funktioniert!

Re: EditorGadget frage...

Verfasst: 09.12.2020 16:15
von Axolotl
Hier mal ein Vorschlag in eine mögliche Richtung: #EM_GETCHARFORMAT mit SendMessage_(...)

MSDN sagt : Determines the character formatting in a rich edit control.

Da EditorGadget auf rich edit control basiert... aktuell auf Basis der MSFEDIT.DLL (Classname = RichEdit50W)

im Englischen Forum: Search Editorgadget
https://www.purebasic.fr/english/viewto ... 13&t=75906

direkt auf der Microsoft Seite:
https://docs.microsoft.com/en-us/window ... t-controls
https://docs.microsoft.com/en-us/window ... charformat

Re: EditorGadget frage...

Verfasst: 09.12.2020 18:20
von Speedy
oh man, harte Materie....
ok, vielen Dank erstmal. Muss mich mal durcharbeiten und schauen wie ich das Bewerkstellige -:~