Seite 1 von 1

MemoEdit() Absturz bei Text mit xbeK_TAB

Verfasst: So, 13. Apr 2014 14:29
von DelUser01
Hallo

Habe das Problem, dass Text die mit XbpMLE erstellt/verändert wurden von manchen Usern auch noch mit MemoEdit() angezeigt werden (sollen).
Ist in dem Text ein xbeK_TAB enthalten stürzt MemoEdit() ab:

Code: Alles auswählen

oError:description:Interne Datenstrukturen beschädigt
Natürlich kann ich die Tabs vorher in Space umwandeln (das passt von der Tab-Schrittweite sowieso nicht zusammen).
War das schon immer so? Dann habe ich das vergessen...

Vermutlich wird es generell besser sein die Tabs in Space zu wandeln...

Gruß
Roland

Re: MemoEdit() Absturz bei Text mit xbeK_TAB

Verfasst: So, 13. Apr 2014 17:31
von Wolfgang Ciriack
Vermutlich wird es generell besser sein die Tabs in Space zu wandeln...
Nur wenn du keine Proportionalschrift verwendest, bei z.b. Arial kannst du Leerzeichen vergessen, du bekommst deine Text nie richtig untereinander dargestellt.

Re: MemoEdit() Absturz bei Text mit xbeK_TAB

Verfasst: So, 13. Apr 2014 22:25
von DelUser01
Hallo Wolfgang

da hast Du recht mit den Schriftarten-Varianten klappt das natürlich nicht einfach nur über Leerzeichen. Deshalb suche ich ja eine andere - vernünftige - Lösung.

Gruß
Roland

Re: MemoEdit() Absturz bei Text mit xbeK_TAB

Verfasst: So, 13. Apr 2014 23:24
von brandelh
zeigt MemoEdit() zeigt sowieso nur fixed fonts an. Wenn ich darin TAB drücke springt er einige Zeichen weiter, ob es aber tatsächlich ein chr(9) ist oder nur die Blanks bis zum nächsten Haltepunkt kann ich nicht sagen.

Re: MemoEdit() Absturz bei Text mit xbeK_TAB

Verfasst: So, 13. Apr 2014 23:49
von DelUser01
Hallo Hubert,

bei MemoEdit() werden so viele Leerzeichen eingefügt wie beim Parameter TAB angegeben werden. Oder man unterdrückt xbeK_TAB ganz bzw. verwendet die Taste anderweitig (z.B. Ende Editiermodus, nächstes Feld).
...wie seit (Clipper) ewigen Zeiten.

Gruß
Roland

Re: MemoEdit() Absturz bei Text mit xbeK_TAB

Verfasst: Mo, 14. Apr 2014 22:39
von AUGE_OHR
Roland Gentner hat geschrieben:Habe das Problem, dass Text die mit XbpMLE erstellt/verändert wurden von manchen Usern auch noch mit MemoEdit() angezeigt werden (sollen).
Ist in dem Text ein xbeK_TAB enthalten stürzt MemoEdit() ab:

Code: Alles auswählen

oError:description:Interne Datenstrukturen beschädigt
reden wir hier von Cl*pper oder Xbase++ MemoEdit() ? wird auch von Cl*pper auf die DBT zugegriffen ?

Re: MemoEdit() Absturz bei Text mit xbeK_TAB

Verfasst: Mo, 14. Apr 2014 23:02
von DelUser01
Hallo Jimmy

vielleicht habe ich das falsch beschrieben.
Es geht natürlich um MemoEdit in der der aktuellen XBase++ Compilerversion.
Bin enttäuscht wie wenig im MLE steckt, habe da mehr erwartet. Ist ein besseres MemoEdit mit Proporionalschrift.
Den Rest - sprich "Das Rad" - muss ich jetzt hier wieder neu erfinden...
...UFF! (...um nicht "übel" zu gebrauchen...)

Nun Ja - weiter im Takt - auch diese Erkenntnis nutzt meinen Kunden nichts...

Gruß
Roland

Re: MemoEdit() Absturz bei Text mit xbeK_TAB

Verfasst: Mo, 14. Apr 2014 23:05
von Tom
Hallo, Roland.
Bin enttäuscht wie wenig im MLE steckt, habe da mehr erwartet.
Das MLE ist ein Standard-Windows-Control. Das kann von Haus aus nicht sehr viel, fürchte ich.

Wenn man deutlich mehr will, muss man andere Controls verwenden. Beispielsweise das "TX Text Control" als Active-X-Komponente:

www.textcontrol.com

Re: MemoEdit() Absturz bei Text mit xbeK_TAB

Verfasst: Mo, 14. Apr 2014 23:17
von DelUser01
Hallo Tom

"deutlich" mehr will ich gar nicht.
Nur die TABs (zugegeben einer der schwierigen Parts)

Das Einbinden von Drittprodukten behagt mir nicht sehr.
(...mit Ausnahme von APIs der MSDN).

Gruß
Roland

Re: MemoEdit() Absturz bei Text mit xbeK_TAB

Verfasst: Di, 15. Apr 2014 6:28
von brandelh
Hi,

natürlich kann XbpMLE() einen chr(9) = TAB-Taste ordnungsgemäß verarbeiten :!:
Was "ordnungsgemäß" ist, hängt von einer Einstellung ab :ignoreTab()

Windows nutzt ja normalerweise die TAB-Taste von einem Control zum anderen (wie gesagt WINDOWS !).
Je nach Einstellung ignoriert also XbpMLE() die eingegebenen TABs im Control und springt zum nächsten.
Oder es ignoriert sie nicht und fügt ein TAB-Sprung in den Text ein.
Das ist alles eine Festlegung von Windows und trifft alle Sprachen.

Tab
Wird als Zeichen in den Editierpuffer übertragen, falls :ignoreTab auf .F. gesetzt ist
Was uns von Xbase normalerweise abgenommen wird ist die Einstellung mit sendmessage() (Windows-API)
und leider gibt es keine direkte Einstellung in Xbase++ somit müssten wir - falls möglich - die Windows-API nutzen.

:arrow: http://msdn.microsoft.com/en-us/library ... 85%29.aspx

und dort sollte es das hier sein, aber wie genau ?

:arrow: http://msdn.microsoft.com/en-us/library ... 85%29.aspx

im PowerBasic Forum hat sich das auch schon jemand gefragt ;-)

:arrow: http://www.powerbasic.com/support/pbfor ... ETTABSTOPS

eventuell hat das ja auch schon jemand in der Alaska Newsgroup oder bei Pablo gefragt ...

Re: MemoEdit() Absturz bei Text mit xbeK_TAB

Verfasst: Di, 15. Apr 2014 7:23
von brandelh
klar doch ;-)

public.xbase++.gui (= p.x.gui) 05.08.2005 16:30 von Robert Major, Antwort von Günter Beyes ... von wem sonst ;-)
Günter Beyes hat geschrieben:Hi Robert,
> How can I set the tab spacings in xbpMLE?
By sending the XbpMLE an EM_SETTABSTOPS message, using the
SendMessage() WinAPI function.
See the attached sample.
---
Regards,
Günter
da war auch ein Anhang (den ich nicht getestet habe):
tabstops.zip
Datei von Günter Beyes
(1.13 KiB) 135-mal heruntergeladen
und noch eine Anmerkung:
By the way, regarding the EM_SETTABSTOPS sample provided above, you may
find that it doesn't work... In that case, pass the 4th parameter to
SendMessage ( i.e. sTabStops ) by reference, and adjust the SendMessage()
wrapper function accordingly. Again a case of copy/paste/edit/break...

Re: MemoEdit() Absturz bei Text mit xbeK_TAB

Verfasst: Di, 15. Apr 2014 9:30
von DelUser01
Hallo Hubert

für die Experimente mit Tab bei MLE muss ich mir mehr Zeit nehmen, das wird nicht einfach. Deshalb habe ich ja schon an anderer Stelle gefragt ob es so etwas wie ein fertiges Editor-Modul mit Tabs gibt welches eingebunden werden kann.
Es muss nichts umfangreiches sein, aber es gibt doch immer wieder Texte die formatierte Tabellen enthalten müssen und da sind Tabs das Mindeste was benötigt wird.

Aber das ursprüngliche Problem hier sind nicht die Tabs im MLE sondern in MemoEdit. da gibt es scheinbar ein Kompatibilitätsproblem.
Bevor ich Text der in MLE (oder Notepad usw.) erstellt wurde und Tabs enthält in MemoEdit anzeige muss ich die Chr( xbeK_TAB ) entfernen sonst stürzt MemoEdit ab.
Zumindest bei mir ist das so.
Auch das wäre ja nicht so schlimm, aber wenn jetzt der Text auch noch in MemoEdit bearbeitet wird muss ich ja eigentlich die Tabs hinterher wieder einfügen. Spätestens da fängt es an lustig zu werden.

Gruß
Roland

Re: MemoEdit() Absturz bei Text mit xbeK_TAB

Verfasst: Di, 15. Apr 2014 11:19
von brandelh
xbeK_TAB ist die Bezeichnung für einen Event, das Zeichen heißt chr(9) ;-)

Du könntest chr(9) gegen EIN chr(255) und je nach benötigter Anzahl " " tauschen (MLE => MemoEdit).
Die Umkehrung wäre es alle chr(255)+" " => chr(255) tauschen und dann chr(255) nach chr(9).
chr(255) sieht aus wie ein Blank, ist aber natürlich keines.

Re: MemoEdit() Absturz bei Text mit xbeK_TAB

Verfasst: Di, 15. Apr 2014 11:28
von DelUser01
Hallo Hubert

xbeK_TAB hat den Wert 9 und ist mit Chr( xbeK_TAB ) das TAB-Zeichen.
Das Chr(...) habe ich mir nur gespart.
Ob es für TAB ein extra Event gibt? Der heißt dann xbeP_Keyboard.

Das mit dem Zeichentauschen z.B. in Chr(255) wäre schon OK, aber wenn der User drüberschreibt wird ein Space draus und die vorherige Tab-Position ist futsch.

Sonst könnte ich ja gleich in Space tauschen (mache ich gerade sowieso).

Gruß
Roland

Re: MemoEdit() Absturz bei Text mit xbeK_TAB

Verfasst: Di, 15. Apr 2014 11:34
von Tom
Hallo, Roland.

Vielleicht kannst Du mal ein Beispiel bauen und posten, so dass der Fehler nachvollziehbar wird. Ich kann in MLEs Tabs verwenden. Völlig problemlos und fehlerfrei.

Re: MemoEdit() Absturz bei Text mit xbeK_TAB

Verfasst: Di, 15. Apr 2014 11:47
von brandelh
Roland Gentner hat geschrieben: Das mit dem Zeichentauschen z.B. in Chr(255) wäre schon OK, aber wenn der User drüberschreibt wird ein Space draus und die vorherige Tab-Position ist futsch.
Sonst könnte ich ja gleich in Space tauschen (mache ich gerade sowieso).
stimmt, wenn du im Text mehr als ein " " findest, kannst du auf ein TAB schließen, aber das ist auch nicht eindeutig ;-)

Ich frage mich allerdings warum es überhaupt vorkommt, dass alte und neue Technik auf EIN Feld angewendet wird ...
stellen deine Kunden nicht alle Arbeitsplätze gleichzeitig um ?

Re: MemoEdit() Absturz bei Text mit xbeK_TAB

Verfasst: Di, 15. Apr 2014 13:00
von brandelh
Roland Gentner hat geschrieben: xbeK_TAB hat den Wert 9 und ist mit Chr( xbeK_TAB ) das TAB-Zeichen.
Das Chr(...) habe ich mir nur gespart.
da habe ich mich falsch ausgedrückt, der Event ist der Keyboardevent und dass dieser define 9 ergibt stimmt natürlich auch,
ich wollte eigentlich sagen, dass man sich hier die Tipperei xbe... sparen kann und gleich den code angibt ;-)

Wie auch immer, MEMOEDIT() hat NORMALERWEISE keine Probleme mit TAB Zeichen.
Das folgende Beispiel zeigt, dass beides ohne Probleme (von dem ì abgesehen) zusammen arbeiten können.
Allerdings ist es in dieser Form wahrlich nicht zu empfehlen ;-)

Code: Alles auswählen

#include "Gra.ch"
#include "Xbp.ch"
#include "Common.ch"
#include "Appevent.ch"

procedure main()
   local oDlg, mp1, mp2, oXbp, cText, oMle, nEvent

   mp1 := mp2 := oXbp := nil
   oDlg := setAppWindow()
   oDlg:SetTitle("Test")

   cText := "Dies ist ein Test" + chr(9) + "von TAB Zeichen"+chr(13)+chr(10)+"Ende"

   @ 0,1 say " F2 = Memoedit, F3 = MLE, Rest Anzeige der Tastaturcodes" COLOR "W+/B"

   cText := MyMemoEdit(cText)


   oMLE := XbpMLE():new(oDlg)
   * oMLE:wordWrap :=.F.
   oMLE:horizScroll := .F.
   oMLE:killInputFocus := {| n1, n, oXbp | cText := oXbp:getData() }

   oMLE:create( , , {50,50}, {400,150} )

   @0,1 say "Text wurde an MLE bergeben ...                     "
   oMLE:setData( cText )
   @0,50 say "und geht gleich weiter ..."

   nEvent := 0                      // Event loop
   DO WHILE nEvent <> xbeP_Close
      nEvent := AppEvent( @mp1, @mp2, @oXbp, 0 )

      do case
         case nEvent == xbeK_ESC         // Esc bricht ab
              EXIT
         case nEvent == xbeK_F2          // F2 => Memoedit()
              @0,1 say "Memoedit startet und blockiert ...                  "
              cText := MyMemoEdit(cText)
              @0,1 say "Memoedit ende, Daten an MLE bergeben ....          "
              oMLE:setData( cText )
              setAppFocus(oMLE)
              @0,50 say "und geht gleich weiter ..."

         case nEvent == xbeK_F3
              @0,1 say "Text wurde an MLE bergeben ...                     "
              oMLE:setData( cText )
              setAppFocus(oMLE)
              @0,50 say "und geht gleich weiter ..."

         case nEvent < xbeB_Event    // Ausgabe im Fenster mit Fokus

              ? "Die Taste hat den Ereigniscode:", nEvent

         case oXbp <> NIL            // Ereignis für Pushbutton
              oXbp:handleEvent( nEvent, mp1, mp2 )
      END
   ENDDO

return

function MyMemoEdit(cText)
   @ 1,1 say "Memoedit Strg+W speichern.            chr(9) im Text ? "+iif(chr(9) $ cText,"JA","NEIN") COLOR "W+/B"
   set color to "n/w"
   @ 2,0 TO 11,41 COLOR "N/BG"

   cText := MemoEdit( cText , 3,1,10,40, .T.)
   cls

   @ 1,1 say "Memoedit Ende in die Eventschleife.   chr(9) im Text ? "+iif(chr(9) $ cText,"JA","NEIN")  COLOR "W+/B"
return cText
Vermutlich liegt dein Problem in deiner benutzerdefinierten Funktion ;-)

Re: MemoEdit() Absturz bei Text mit xbeK_TAB

Verfasst: Di, 15. Apr 2014 14:51
von brandelh
Roland Gentner hat geschrieben:Das Einbinden von Drittprodukten behagt mir nicht sehr.
(...mit Ausnahme von APIs der MSDN).
Solange es um Xbase++ DLLs geht, deren Quellcode man nicht hat, ist das auch gefährlich, wer weiß wie lange support besteht ...

Wenn es aber um Standard-DLLs geht, besteht kein Unterschied zur M$ API, was geht geht, mehr hat niemand versprochen.
Mit OT4XB kann man darauf zugreifen und Sachen wie PDF Erstellung oder richtige XLS Erstellung kann man selbst ohne Fremd-DLL nicht durchführen.

Von Active-X bin ich ja nicht der Freund, aber auch da muss man sagen wenn es funktioniert, was solls.
Bevor ich heute mit MEMOEDIT() eine Textverarbeitung nachbauen (das habe ich auch gemacht und eine läuft auch noch)
oder mich mit dem Aufbohren von XbpMLE() aufhalten würde, wäre ein Control mit dem TOM gute Erfahrungen gemacht hat sicher meine erste Wahl.

Wenn es um Eingabemaskierung beim XbpSLE() geht, da habe ich jede Menge Erfahrung und das funktioniert gut,
da will man meist aber auch keine Schriften, Tabulatoren oder Bilder einbinden etc. ;-)