Text an notepad senden und unter bestehendem Text einfügen ?

Für allgemeine Fragen zur Programmierung mit PureBasic.
TWELVE
Beiträge: 72
Registriert: 01.04.2007 18:33

Re: Text an notepad senden und unter bestehendem Text einfüg

Beitrag von TWELVE »

matbal hat geschrieben: Ich vermute mal, daß es nur mit dem Format der Zeilenumbrüche zu tun hat. Verwendet der Text #CRLF$ für die Zeilenumbrüche, wird er auch mit Zeilenumbrüchen in Notepad geschrieben.

Wenn der Zeilenumbruch nur aus einem #CR$ oder #LF$ besteht, kommt der Text als eine Zeile an. Aber das ließe sich ja mit ReplaceString() vor dem senden korrigieren.
Ja, genauso war's ;-) Wenn ich CR durch CRLF ersetze, stimmt die Formatierung wieder.

Sieht dann so aus:

Code: Alles auswählen

text.s = GetSelectedEditorText(Editor_1) 
text.s = ReplaceString(text.s,#CR$, #CRLF$)
   hEdit = FindWindowEx_(notepad_hWnd, 0, "Edit", 0)
   SendMessage_(hEdit,#EM_SETSEL, $fffffff, $fffffff)  
   SendMessage_(hEdit,#EM_REPLACESEL, 0, text.s)
Und es funktioniert zuverlässig auch auf dem zweiten PC, wo ich Probleme mit dem #WM_PASTE hatte.Und ich muß das Clipbioard nicht
benutzen.

Damit wäre das im Moment meine bevorzugte Lösung.Was mich allerdings verwirrt, ist die Tatsache, dass #WM_PASTE die Zeilenvorschübe
korrekt handhabt und dass ich CR ( 0D) gegen CRLF ( 0D0A) austauschen muß.Die Textfiles stammen von einem Linux System und sind
in UTF-8 kodiert ( wobei das hier keine große Rolle spielt, da dieser ohne Umlaute deckungsgleich mit ASCII ist), die Linefeeds sind
mit 0A kodiert, also LF ( mit Hexeditor überprüft).Die Files werden als UTF-8 in eine Variable eingelesen und dann wird der Text mittels

SetGadgetText(Editor_1, Filetext.s)

in ein EditorGadget geschrieben.Wandelt das EditorGadget LFs in CRs um ?


Danke an matbal für die sehr konstruktiven Beiträge hier...
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Text an notepad senden und unter bestehendem Text einfüg

Beitrag von ts-soft »

Linux und moderne Macs nutzen $LF zum Zeilenumbruch.
Ältere Macs nutzen $CR zum Zeilenumbruch.
Windows nutzt $CRLF zum Zeilenumbruch (in Editor o. ä.). Dies gilt aber nicht für alle Controls/Gadgets.

$LF = Line-Feed (Zeilenvorschub)
$CR = Carriage-Return (Wagenrücklauf)
stammt noch aus Zeiten der Schreibmaschine :mrgreen:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
TWELVE
Beiträge: 72
Registriert: 01.04.2007 18:33

Re: Text an notepad senden und unter bestehendem Text einfüg

Beitrag von TWELVE »

ts-soft hat geschrieben:Linux und moderne Macs nutzen $LF zum Zeilenumbruch.
Ältere Macs nutzen $CR zum Zeilenumbruch.
Windows nutzt $CRLF zum Zeilenumbruch (in Editor o. ä.). Dies gilt aber nicht für alle Controls/Gadgets.

$LF = Line-Feed (Zeilenvorschub)
$CR = Carriage-Return (Wagenrücklauf)
stammt noch aus Zeiten der Schreibmaschine :mrgreen:

Das ist bekannt :-)

Die Frage war eine andere : warum müssen in einem Text, der vom Linux kommt und nachweislich 0A ( LF) Zeilenvorschübe
hat ( Hexedit) , CRs ( 0D) gegen CRLFs getauscht werden ? In meinen Textfiles sind nachweislich keine CRs enthalten !

Wird der gleiche Text über das Clipboard ins Notepad eingefügt, ist die Formatierung ohne Umwandlung der Linefeeds
ok.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Text an notepad senden und unter bestehendem Text einfüg

Beitrag von ts-soft »

Weil die meisten Editoren damit umgehen können, aber MS nicht :mrgreen:
Öffne doch mal einen Linux-Text File in Editor, dann wirste sehen, dass keine Umbruch vorhanden sind. Nimmste nen vernünftigen Editor (fast jeder, außer Editor), dann sind Umbrüche vorhanden.

Frag am besten MS, warum der Editor das nicht kann, zumal er ja ansonsten das stabilste Programm von MS ist. :mrgreen:
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
TWELVE
Beiträge: 72
Registriert: 01.04.2007 18:33

Re: Text an notepad senden und unter bestehendem Text einfüg

Beitrag von TWELVE »

ts-soft hat geschrieben:
Öffne doch mal einen Linux-Text File in Editor, dann wirste sehen, dass keine Umbruch vorhanden sind. Nimmste nen vernünftigen Editor (fast jeder, außer Editor), dann sind Umbrüche vorhanden.
Das ist bekannt und nicht der Punkt :-) Die Frage war: woher kommen die CRs, wenn im Textfile nur LFs sind ?

Und warum trifft das beim Einfügen des Clipboards nicht zu ? Da wandle ich ja auch keine Linefeeds um und
trotzdem stimmt die Formatierung im Notepad.
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Text an notepad senden und unter bestehendem Text einfüg

Beitrag von ts-soft »

Weil MS das für Dich macht. Frag die warum.
ts-soft hat geschrieben:Windows nutzt $CRLF zum Zeilenumbruch (in Editor o. ä.). Dies gilt aber nicht für alle Controls/Gadgets.
Und warum die nicht überall dasselbe nutzen.

Oder Du nimmst das einfach als gegeben und hinterfragst es nicht mehr, hat nämlich nicht viel Sinn.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
TWELVE
Beiträge: 72
Registriert: 01.04.2007 18:33

Re: Text an notepad senden und unter bestehendem Text einfüg

Beitrag von TWELVE »

ts-soft hat geschrieben:Oder Du nimmst das einfach als gegeben und hinterfragst es nicht mehr, hat nämlich nicht viel Sinn.

Es ist wichtig, diese Dinge zu hinterfragen, damit sie beim programmieren berücksichtigt werden können.Auch wenn Du
Dir alle Mühe gibst, es mit MS zu erklären - mich interessiert gar nicht, warum MS etwas so macht wie es gemacht ist,
sondern ich möchte das Verhalten verstehen.Wenn das Notepad eingefügten Text AES verschlüsselt - bitte schön.Aber
ich muß es wissen, ob es das tut.

So, bitte wieder zurück zum Thema, hier geht's ja um programmieren und nicht um philosophieren :-)
matbal
Beiträge: 246
Registriert: 30.03.2011 20:53

Re: Text an notepad senden und unter bestehendem Text einfüg

Beitrag von matbal »

Interessant ist, daß verschiedene API-Funktionen, mit denen man den Text aus dem EditorGadget auslesen kann, verschiedene Zeilenumbruchzeichen verwenden.

Lese ich aus einem EditorGadget einen mehrzeiligen Text per SendMessage_() und #WM_GETTEXT, enthält der Text CRLF.
Lese ich den gleichen Text per SendMessage_() und #EM_GETSELTEXT, enthält der Text einfache CR.
TWELVE
Beiträge: 72
Registriert: 01.04.2007 18:33

Re: Text an notepad senden und unter bestehendem Text einfüg

Beitrag von TWELVE »

matbal hat geschrieben: 08.05.2015 21:24 Nachdem deine Prozedur nicht immer erfolgreich war, hatte ich im Internet gesucht und einen C-Code gefunden. Den habe ich nach PB Übertragen und hinterher festgestellt, daß der Code von auser im Prinzip genauso arbeitet. Ausprobiert habe ich ihn nicht.

Denke daran, daß es einige Millisekunden dauert, bis Notepad das Fenster erstellt hat. Solange das Fenster nicht geöffnet ist, bekommst du kein Handle. Daher habe ich auch eine Schleife verwendet...

Hier mein Test-Code:

Code: Alles auswählen

EnableExplicit

Define Prog_ID
Define Prog_PID
Global Prog_hWnd


Procedure EnumWindowsCallback(hwnd, lParam)
   Protected ProcessId
   
   GetWindowThreadProcessId_(hwnd, @ProcessId)
   If (ProcessId = lParam)
      Prog_hWnd = hwnd
      ProcedureReturn #False
   EndIf
   ProcedureReturn #True
EndProcedure

Procedure Button_Click()
   Protected text$ = GetGadgetText(1)

   SendMessage_(GetDlgItem_(Prog_hWnd, 15),#EM_SETSEL, $fffffff, $fffffff)  
   SendMessage_(GetDlgItem_(Prog_hWnd, 15),#EM_REPLACESEL, 0, text$ + #CRLF$) 
EndProcedure



Prog_ID = RunProgram("notepad.exe", "", "", #PB_Program_Open)

If Prog_ID 
   Prog_PID = ProgramID(Prog_ID)
   
   Repeat
      Delay(100)
      EnumWindows_(@EnumWindowsCallback(),Prog_pID)
   Until Prog_hWnd 
   
   Debug "Prog_ID: "  + Str(Prog_ID)
   Debug "Prog_PID: " + Str(Prog_PID)
   Debug "Prog_hWnd: " + Str(Prog_hWnd)
   
      
   ; Demo-Fenster
   OpenWindow(0, 100, 100, 220, 80, "Fenster")
   StringGadget(1, 10, 10, 200, 20, "Textzeile")
   ButtonGadget(2, 10, 40, 100, 25, "Senden")
   BindGadgetEvent(2, @Button_Click())
   
   Repeat
   Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIf
Das funktioniert unter Windows 11 nicht mehr.Das Notepad geht auf, aber der gesendete Text erscheint nicht im Notepad.

Ich mußte mit einem System, auf dem ich mein Tool nutze, auf Windows 11 wechseln und seitdem kann ich aus dem Tool keinen Text mehr ans Notepad senden.

Hat jemand eine Erklärung bzw. einen Workaround dafür ?
Benutzeravatar
mk-soft
Beiträge: 3695
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Text an notepad senden und unter bestehendem Text einfügen ?

Beitrag von mk-soft »

Geht es noch unter Windows 10 ?
Ich habe kein Windows 11, aber es könnte eine Sache der Sicherheit sein.
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Antworten