Migration von Clipper auf Xbase V2

Auf dem Weg von Clipper, FoxPro u.ä. nach Xbase++

Moderator: Moderatoren

Antworten
Benutzeravatar
satmax
1000 working lines a day
1000 working lines a day
Beiträge: 831
Registriert: Do, 02. Dez 2010 19:34
Wohnort: Biberbach in Österreich
Hat sich bedankt: 1 Mal
Danksagung erhalten: 1 Mal
Kontaktdaten:

Migration von Clipper auf Xbase V2

Beitrag von satmax »

Ich fange jetzt einen neuen Thread an und hoffe das ist so ok. Bei dem anderen Thread wird immer wieder auf das erste alte Posting eingegangen (1 Jahr alt... :)

Zu meiner großen Überraschung ist es mir heute gelungen, den Clipper DBU auf einen XBase++ DBU inkl. Comix Index (cdx) und Foxpro Memofelder (FPT) umzustellen. Soweit ich das getestet habe, funktioniert das einwandfrei!

Das ist ein wichtiger Meilenstein beziehungsweise ein wichtiges Argumt zur Umstellung: so ist es möglich, mit beiden Programmen paralell zu arbeiten. Es ist in den ersten Moanten sicher günstig, wenn man jederzeit auf die alte app zurückgreifen kann.

Danke nochmals an alle die mir aus den Startlöchern geholfen haben. Ganz durch bin ich aber noch nicht mit meinen Fragen. :)

OEM oder ANSI das ist die Frage, welchen Compilerswitch verwendet Ihr?

/ga Literale Zeichen nach ANSI konvertieren
/go Literale Zeichen nach OEM konvertierend

Nehme ich /ga oder /go, stimmen zwar die Umlaute so wie in MultiEdit eingegeben, die ganzen Sonderzeichen für die Rahmen beim DBU sind aber dann falsch... Während der Umstellunsphase braucht man sicher die SOnderzeichen für die Rahmen immer wieder mal.

Gruß
Markus
Gruß
Markus
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Migration von Clipper auf Xbase V2

Beitrag von brandelh »

Hi,

wenn ich CRT Anwendungen mit MED schreibe, erzeuge ich OEM Quellcode und das Programm läuft auf OEM,
die Zugriffe auf z.B. Dateinamen auf der Festplatte werden mit ConvToAnsiCP() umgewandelt (falls Umlaute drinn vorkommen können).
Die DBFNTX macht automatisch die Umwandlung ...
Einen Compilerschalter (/GA/GO) nutze ich NIE.

Wenn ich Windows GUI Anwendungen schreibe, erzeuge ich ANSI Quellcode, das Programm läuft auf ANSI und alles geht automatisch.
Die Schalter braucht man, wenn man z.b. für CRT OEM Quellcode bräuchte, aber mit dem Editor nur Ansi erzeugen kann (VX / Workbench), dann kann man mit /GO ein OEM Programm erstellen,
muß aber dennoch ConvToAnsiCP() für Systemzugriffe benutzen.

Einen OEM Editor und ANSI Programme (dafür wäre ja wohl /GA) kann man keinesfalls empfehlen, dann besser den Quellcode umsetzen (z.B. mit Xbase++ ;-) )

Bei den alten Linienzeichen fehlen die doppel auf einfach Linienkreuzungen, aber damit kann man leben.
Gruß
Hubert
Benutzeravatar
satmax
1000 working lines a day
1000 working lines a day
Beiträge: 831
Registriert: Do, 02. Dez 2010 19:34
Wohnort: Biberbach in Österreich
Hat sich bedankt: 1 Mal
Danksagung erhalten: 1 Mal
Kontaktdaten:

Re: Migration von Clipper auf Xbase V2

Beitrag von satmax »

Hallo Hubert,

ich habe wohl ein Brett vorm H*...

Ich schreibe in Multi-Edit:

Code: Alles auswählen

PROCEDURE Main
  CLS
  ? "Hello World äöü"
  ? "ÖÄÜß"
RETURN
Raus kommt

Code: Alles auswählen

Hello World õ÷³
Í─▄▀
Egal ob ich im Editor OEM oder ANSI einstelle. Verwende ich /ga passen die Umlaute

Gruß
Markus
Gruß
Markus
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: Migration von Clipper auf Xbase V2

Beitrag von AUGE_OHR »

satmax hat geschrieben:OEM oder ANSI das ist die Frage, welchen Compilerswitch verwendet Ihr?
Diese Frage muss man sich im Detail genauer ansehen.

Cl*pper verwendet NTX und die DBF ist OEM.
Windows verwendet ANSI bzw Unicode.

Xbase++ VIO ( Fullscreen ) oder CRT Fenster können OEM Zeichen > 128 darstellen

Xbase++ GUI Anwendungen werden mit /PM:PM gelinkt
Xbase++ Hybrid Mode wird mit /PM:PM gelinkt

wenn man unter Xbase++ mit einer GUI Anwendung mittels DBFNTX zugreift
tritt die OEM <-> ANSI Konvertierung für die DBF Daten auf
wenn man ein CRT MDI/SDI Fenster in einem XbpDialog ( GUI ) hat und von dort
mittels DBFNTX zugreift dann bekommt man immer OEM.

die beiden Compiler Schalter beziehen sich nun auf deinen "statischen" Text
den du mittels deines Editor in deinen Source Code schreibst.
wenn du noch mit einem "DOS" Editor wie ETP ( von KRS ) arbeitest ist das immer OEM
der Windows Notepad Editor ist nun ANSI

grob gesagt :

wenn du mit DBFNTX und VIO/CRT Fenster arbeitest dann OEM Editor

wenn du GUI Parts verwendet bist du in der ANSI Welt und muss evtl. mittels ConvToOemCP()
Ergebnisse z.b. von XbpFileDialog() nach OEM konvertieren.
gruss by OHR
Jimmy
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Migration von Clipper auf Xbase V2

Beitrag von brandelh »

satmax hat geschrieben:Hallo Hubert,

ich habe wohl ein Brett vorm H*...

Ich schreibe in Multi-Edit:

Code: Alles auswählen

PROCEDURE Main
  CLS
  ? "Hello World äöü"
  ? "ÖÄÜß"
RETURN
Raus kommt

Code: Alles auswählen

Hello World õ÷³
Í─▄▀
Egal ob ich im Editor OEM oder ANSI einstelle. Verwende ich /ga passen die Umlaute

Gruß
Markus
ich kenne mich mit Multiedit nicht aus, aber bei MED muss ich VOR dem Tippen die Auswahl treffen, oder danach sagen OEM > ANSI (oder umgekehrt) Konvertierung.
Im Prinzip gilt, dass wenn du mit NOTEPAD die Umlaute richtig siehst, dann ist der Text in ANSI, wenn er in der Dosbox mit copy t.txt con richtig zu lesen ist, dann ist es OEM.

Wenn aber /ga die Umlaute richtet ... deine Erklärung zum Schalter weiter oben ist vertauscht:
/ga Literale Zeichen von ANSI nach OEM konvertieren

kannst du auch weiterhin ANSI Code erstellen und /ga nutzen. Werden da BOX Zeichen angezeigt ?
Gruß
Hubert
Benutzeravatar
satmax
1000 working lines a day
1000 working lines a day
Beiträge: 831
Registriert: Do, 02. Dez 2010 19:34
Wohnort: Biberbach in Österreich
Hat sich bedankt: 1 Mal
Danksagung erhalten: 1 Mal
Kontaktdaten:

Re: Migration von Clipper auf Xbase V2

Beitrag von satmax »

Aktueller Stand:

ich werde mit GUI arbeiten, Datenbank ist DBFCDX mit ftp Memofelder. /ga richtet die Umlaute, die BOX Zeichen werden nicht angezeigt. Mal sehen ob ich ohne auskommen.

Ich werde jetzt als nächstes versuchen einige Stammdaten auf XBase++ (GUI) zu portieren. Verwendet man für die Bildschirmmasken optimalerweise den XBase++ FormDesigner und läßt sich damit den Code generieren?

Gruß
Markus
Gruß
Markus
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2821
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 94 Mal
Danksagung erhalten: 13 Mal

Re: Migration von Clipper auf Xbase V2

Beitrag von georg »

Hallo, Markus -


also, ich habe den Formdesigner versucht, und hassen gelernt. Meine Bildschirmmasken baue ich mir selbst, "on the fly", bzw. für generische Datenpflege erzeuge ich die Masken automatisiert anhand der Dateistruktur.

Man muss sich halt mal eine Weile hinsetzen und die Unterschiede zu Windows "verinnerlichen", dann klappt der Umstieg von 0,0 oben links zu 0,0 unten links auch.
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Benutzeravatar
Wolfgang Ciriack
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2932
Registriert: Sa, 24. Sep 2005 9:37
Wohnort: Berlin
Hat sich bedankt: 13 Mal
Danksagung erhalten: 34 Mal
Kontaktdaten:

Re: Migration von Clipper auf Xbase V2

Beitrag von Wolfgang Ciriack »

Auch hier nochmals der Hinweis zu schnellen Erfolgen bei der Umsetzung in Bezug auf @say...get etc.
Schau dir mal eXPress++ von Roger Donnay an.
Viele Grüße
Wolfgang
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14641
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 87 Mal
Kontaktdaten:

Re: Migration von Clipper auf Xbase V2

Beitrag von Jan »

georg hat geschrieben:Hallo, Markus -

also, ich habe den Formdesigner versucht, und hassen gelernt. Meine Bildschirmmasken baue ich mir selbst, "on the fly", bzw. für generische Datenpflege erzeuge ich die Masken automatisiert anhand der Dateistruktur.
Agree. Ich arbeite (fast) nie mit dem Formdesigner, nur mal um für ActiveX-Elemente die Daten rauszuziehen, wenn ich die sonst nicht schnell finden kann.
georg hat geschrieben:Man muss sich halt mal eine Weile hinsetzen und die Unterschiede zu Windows "verinnerlichen", dann klappt der Umstieg von 0,0 oben links zu 0,0 unten links auch.
Wenn jemand von Vorne anfängt, dann sollte er tunlichst die noch undokumentierten Einstellungen verwenden für TopLeft. Den gibt es sowohl für die Dialoge als auch für die Ausdrucke. Als ich die vor Jahren mal rausgefunden habe hab ich damals alle meine Programme darauf umgeschrieben. Das war eine totale Ochsentour, aber letztendlich hat es sich gelohnt.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
satmax
1000 working lines a day
1000 working lines a day
Beiträge: 831
Registriert: Do, 02. Dez 2010 19:34
Wohnort: Biberbach in Österreich
Hat sich bedankt: 1 Mal
Danksagung erhalten: 1 Mal
Kontaktdaten:

Re: Migration von Clipper auf Xbase V2

Beitrag von satmax »

Wolfgang Ciriack hat geschrieben:Auch hier nochmals der Hinweis zu schnellen Erfolgen bei der Umsetzung in Bezug auf @say...get etc.
Schau dir mal eXPress++ von Roger Donnay an.
Danke für den Hinweis. Leider funktioniert das Demo nicht. Ich habe eine Mail an Roger Donny gesandt.
Gruß
Markus
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Migration von Clipper auf Xbase V2

Beitrag von brandelh »

Ich nutze den Formdesigner um die Form mit Controls zu bestücken, die Ausrichtung aber nur ungefähr.
Parents ordne ich keine zu (also Tabpages etc.), danach kann es nämlich vorkommen dass einige verschwinden.
Auch Farben etc. eher nicht ...
Aber ich Benenne die Controls so wie ich sie haben will und das Fenster wie mein Klassennamen sein soll.
Danach erzeuge ich CLASS code und ändere beide PRGs mit dem Editor:

_xyz.prg // nutze ich für die Anordnung, einfache Beschriftung etc.

in INIT lasse ich die Positionen und die Größe unberührt (früher habe ich sie hier geändert)
in Create setze ich mit Variablen (nPosX, nPosY, nPBSizeX, nPBSizeY, nSLEVorschub) etc. die Positionen und Größen,
dabei kann man bei schon erstellten auch die Größe abfragen (dynamisch zum Nachbarn etc.)
Die Reihenfolge der CREATE Aufrufe bestimmt übrigens die TAB Reihenfolge.
Besser wäre es aber POS, SIZE und Ausrichtung von Controls dynamisch in der Methode Resize() zu erledigen, dort kann man
auch auf Größenänderungen des Fensters reagieren. Ich nutze das aber so nicht.

xyz.prg // hier schreibe ich die Methoden die Leben in die Anwendung bringen.

Im Prinzip sieht das so ähnlich aus, wie die Reihen und Spalten die ich früher in Clipper genutzt habe ...
und natürlich könnte man dies in eine DBF oder INI oder XML Datei auslagern (Datadriven ...)
Gruß
Hubert
Benutzeravatar
satmax
1000 working lines a day
1000 working lines a day
Beiträge: 831
Registriert: Do, 02. Dez 2010 19:34
Wohnort: Biberbach in Österreich
Hat sich bedankt: 1 Mal
Danksagung erhalten: 1 Mal
Kontaktdaten:

DbUseArea hat ein anders Verhalten

Beitrag von satmax »

Unter Clipper hat das funktioniert:

Code: Alles auswählen

//DbUseArea(.t.,"FOXCDX","AUFTRAG","AUFTRAG",.t.) 
//SET ORDER TO TAG AAUNR

Die dazugehörige Indexdatei wurde automatisch geöffnet (gleicher Name wie DB nur andere Erweiterung). Unter XBase wird die Indexdatei nicht automatisch geöffnet oder kann man das wo einstellen?

Unter XBase++ funktioniert aber:

Code: Alles auswählen

USE "AUFTRAG" INDEX "AUFTRAG" NEW
SET ORDER TO TAG AAUNR
Gruß
Markus
Gruß
Markus
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Migration von Clipper auf Xbase V2

Beitrag von brandelh »

Auch wenn das jetzt noch funktioniert (EINE lineare Anwendung) ist es veraltete Syntax (OK für kurze Dienstprogramme) !
Spätestens wenn eine MDI Anwendung beliebig viele Fenster öffnen kann kommt man so nicht weiter.
Am Besten spricht man die offenen Dateien unter dem numerischen Handle an, das select() zurückliefert und man muss auf NETERR() testen !

Code: Alles auswählen

...
use (cDatei) shared ...
if neterr()
   fehlermeldung
else
   nDB1 := select()
   set index to (cDatei) // DBF und INDEX heißen gleich (z.B. CDX), ansonsten anderer Name ...
   ...
   (nDB1)->(dbGoTop()) ...   
   do while ! (nDB1)->(eof())
       ...
       (nDB1)->(dbSkip()) ...
   enddo
   ...
   (nDB1)->(dbEval( {|| ... } , bForBlock )) ...
   ...
   if (nDB1)->(dbSeek(cSuchInd)) ...
   ...
   (nDB1)->(dbCloseArea()) ...
endif
Gruß
Hubert
Benutzeravatar
satmax
1000 working lines a day
1000 working lines a day
Beiträge: 831
Registriert: Do, 02. Dez 2010 19:34
Wohnort: Biberbach in Österreich
Hat sich bedankt: 1 Mal
Danksagung erhalten: 1 Mal
Kontaktdaten:

Re: Migration von Clipper auf Xbase V2

Beitrag von satmax »

Ja, das war in der Tat nur ein kleines Exportprogramm.

Ich habe mir da jetzt noch keine allzu großen Gedanken gemacht. Bisher hatte ich einfach alle Datenbanken beim Programmstart geöffnet und bei Bedarf dann einfach mit Select NAME umgeschaltet. Wobei man da jetzt natürlich aufpassen muss wenn der User zwischen den verschiedenen Fenstern umschalten kann (und mir somit den Satzzeiger und den selektierten Index verstellt). Sicher hat jedes Fenster so etwas wie Los/Get Focus wo man sich einklinken kann...

Unter Umständen wäre es sinnvoller, für jedes Fenster ein eigenes Datenbankobjekt zur Verfügung zu stellen. Wenn ich es richtig verstehe, machst Du das ja mit nDB1.
Zumindest wenn nDB1 eine locale Variable ist. Man muss dann aber immer alle offenen Datenbanken an die Subrutinen übergeben...
Gruß
Markus
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Migration von Clipper auf Xbase V2

Beitrag von brandelh »

Im Beispiel war es eine Variable, tatsächlich verwende ich eine Instanzvariable meiner Fensterklasse (Erweiterung von XbpDialog()),
::Hauptalias speichert den Select-Bereich meine Hauptdatei und
::aAlias := { nDB1, nDB2, nDB3 } etc.

Code: Alles auswählen

in ::Create():
::Hauptalias := select()
aadd(::aAlias , nSonstigeDB... )
... irgendwo im Fenster
(::Hauptalias)->(...()) 
die Close() Routine des Fensters geht dann ::aAlias durch, ob noch eine DBF offen ist und schließt diese notfalls.
Je nach Fenster lege ich auch dort richtige Namen an.

Diese Technik hat aber ein riesen Problem, wenn das Netzwerksperrverhalten nicht einwandfrei funktioniert.
*SMP1* und *SMP2* sind hierzu ergibige Suchbegriffe. Windows Server 2003 mit OpLocks, oder neuere mit SMB2 oder Windows 7 als Client - Microsoft macht die Dateiverwaltung mit gesharten Dateien immer schwerer. Aus diesem Grunde öffne ich meine Dateien nur noch über eine zentrale Funktion für Suchen, Lesen oder Schreiben. Meine Fenster fordern in diesen Fällen dann die Daten direkt von der Funktion an und bekommen Array bzw. Objekte (ab 2.0 sollen die Datenobjekte auch flexibel und schnell sein). Ähnlich wie Excel ein Arbeitsblatt öffnet und darin arbeitet.
Da muss man dann natürlich schon etwas umdenken, insbesondere wenn man verhindern muss, dass 2 Mitarbeiter gegenseitig die Daten überschreiben. Hierzu siehe DBFDBE LOCK_MODE ... automatische Satzsperren mit Fehlerbehandlung können das erleichtern.

Mit einem SQL Server ist man viele dieser Probleme los (die Lost Updates nicht ohne weiteres soweit ich weiß).
Auch EIN Terminal Server mit LOKALEN Daten beseitigt viele Probleme, da auf einem Rechner diese Sperrprobleme meines Wissens nicht auftreten.
Die Clients haben dann auch keinen direkten Zugriff auf die Daten und über das Netz gehen nur Bildinfos die sich geändert haben.
Gruß
Hubert
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2821
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 94 Mal
Danksagung erhalten: 13 Mal

Re: Migration von Clipper auf Xbase V2

Beitrag von georg »

Hallo,


die Migration von Clipper auf ein Windows-Programm ist nicht ganz so einfach, wie man sich das denkt. Da Clipper nicht mit mehreren Threads arbeiten konnte, sind die alten Programme auch nicht darauf vorbereitet. Wenn man eine DBF-Datei im Browse anzeigte (KUNDEN.dbf), dann konnte KEINER den aktiven Index bzw. den Record Pointer verändern.

Wenn Du - wie bisher - die KUNDEN.dbf einmal öffnest und anzeigst, macht Dein Anwender ein anderes Fenster auf, und sucht z.B. bei der Auftragserfassung nach einem Kunden. Damit ändert sich der Record Pointer (auch in Deinem Browse, da beide auf den gleichen SELECT()-Bereich zugreifen - egal, ob der über Namen oder Nummer adressiert wird). Hier muss man sich überlegen, wie man vorgehen will. Ein Ansatz wäre es, mit verschiedenen Threads zu arbeiten (dann sind die SELECT()-Bereiche der einzelnen Threads gegeneinander "isoliert").

Du solltest auch zu dem Thema mal in unsere WiKi schauen, die ist zwar noch im Aufbau, aber manches zu diesen Themen wird schon behandelt.
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Benutzeravatar
satmax
1000 working lines a day
1000 working lines a day
Beiträge: 831
Registriert: Do, 02. Dez 2010 19:34
Wohnort: Biberbach in Österreich
Hat sich bedankt: 1 Mal
Danksagung erhalten: 1 Mal
Kontaktdaten:

Re: Migration von Clipper auf Xbase V2

Beitrag von satmax »

Wolfgang Ciriack hat geschrieben:Auch hier nochmals der Hinweis zu schnellen Erfolgen bei der Umsetzung in Bezug auf @say...get etc.
Schau dir mal eXPress++ von Roger Donnay an.

Sehe ich das richtig, mit eXPress kann ich den GUI Mode ( XbpDialog) verenden und habe trotzdem noch @ GET & SAY?
Gruß
Markus
Benutzeravatar
satmax
1000 working lines a day
1000 working lines a day
Beiträge: 831
Registriert: Do, 02. Dez 2010 19:34
Wohnort: Biberbach in Österreich
Hat sich bedankt: 1 Mal
Danksagung erhalten: 1 Mal
Kontaktdaten:

Re: Migration von Clipper auf Xbase V2

Beitrag von satmax »

georg hat geschrieben:Hallo,

Du solltest auch zu dem Thema mal in unsere WiKi schauen, die ist zwar noch im Aufbau, aber manches zu diesen Themen wird schon behandelt.
Danke für den Hinweis, ich kannte das wiki noch nicht. Es ist zwar noch nicht sehr umfangreich ich habe mir aber dennoch schon einiges herausgelesen, super! Bitte weitermachen- :)
Gruß
Markus
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: Migration von Clipper auf Xbase V2

Beitrag von AUGE_OHR »

satmax hat geschrieben:Ich werde jetzt als nächstes versuchen einige Stammdaten auf XBase++ (GUI) zu portieren. Verwendet man für die Bildschirmmasken optimalerweise den XBase++ FormDesigner und läßt sich damit den Code generieren?
JA ... gerade weil der XppFd dir Code generieren kann !
du solltest mal alle möglichen XbParts ausprobieren und dir dann den Class Code ansehen.

DBF Felder können über den Assistenten ausgewählt werden welche man platzieren will.
die Feld Namen werden zu Class Var übernommen welches zu dem entsprechen XbPart ( SLE ) gehört.

über das Design mache ich mir an dieser Stelle noch gar keine Gedanken denn ein Windows Fenster kann ja seine Grösse verändern (resize) und dann stimmt die Optik nicht mehr. man könnte auch alle XbParts mit Pos / Size {0,0} erstellen und erst beim resize / paint die relativen Pos / Size Werte ermitteln.

Tip : zwischendurch immer als neue Vorlage Version (anderen Namen) ABSPEICHERN !
gruss by OHR
Jimmy
Benutzeravatar
Rudolf
Programmier-Gott
Programmier-Gott
Beiträge: 1418
Registriert: Mo, 02. Jan 2006 23:03
Wohnort: Salzburg/Österreich
Kontaktdaten:

Re: Migration von Clipper auf Xbase V2

Beitrag von Rudolf »

Hallo,
ich kann eXpress++ auch sehr empfehlen, spart sehr viel Zeit und bietet viel mehr Möglichkeiten. Du kannst fast den gleichen Code verwenden und um die GUI Optionen erweitern. Und wenn Du objektorientiert arbeiten willst, stehen alle Elemente auch als Objekte zur Verfügung.
Grüße
Rudolf
Benutzeravatar
Wolfgang Ciriack
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2932
Registriert: Sa, 24. Sep 2005 9:37
Wohnort: Berlin
Hat sich bedankt: 13 Mal
Danksagung erhalten: 34 Mal
Kontaktdaten:

Re: Migration von Clipper auf Xbase V2

Beitrag von Wolfgang Ciriack »

Sehe ich das richtig, mit eXPress kann ich den GUI Mode ( XbpDialog) verenden und habe trotzdem noch @ GET & SAY?
Ja, dass siehst du richtig, nur das es statt @say...get @dcsay...get heißt und statt read dcread gui.
Aber gerade für den Umstellung ist dieses m.E. eine große Erleichterung, mit seinen von Clipper gewohnten Befehlen einen schnellen Erfolg zu erzielen. Wenn ich eXPress++ vor 10-12 Jahren nicht gehabt hätte, wäre ich wohl nicht bei XBase++ geblieben.
Außerdem kann man von Rogers Beispielen und Quellcode eine Menge lernen :razz:
Viele Grüße
Wolfgang
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Migration von Clipper auf Xbase V2

Beitrag von brandelh »

AUGE_OHR hat geschrieben:über das Design mache ich mir an dieser Stelle noch gar keine Gedanken denn ein Windows Fenster kann ja seine Grösse verändern (resize) und dann stimmt die Optik nicht mehr. man könnte auch alle XbParts mit Pos / Size {0,0} erstellen und erst beim resize / paint die relativen Pos / Size Werte ermitteln.
da stimme ich grundsätzlich zu, aber man braucht bei NEW bzw. CREATE keine {0,0} angeben, der Standardwert "LEER" = NIL reicht und im Resize dann die ganzen schönen Anpassungen.
Gerade wenn man Fenster mit veränderbaren Rahmengrößen plant/braucht, gibt es gar keinen anderen Weg, da man es hier sowieso machen muss.

Layoutfragen ...

Nicht ALLE Controls sollten wirklich (in alle Richtungen) größer werden.
Die Beschriftungen links z.B. brauchen genug Platz bei der kleinsten Fenstergröße, aber auch nicht mehr bei der größten ...
SLE für PLZ brauchen auch nicht wachsen, einzeilige Textfelder (XbpSLE()) können nach rechts länger werden wenn der Inhalt das sinnvoll erscheinen läßt, aber in die Höhe sollte sich bei gleicher Schrift nicht ändern ... bei einem Memofeld sieht das ganz anders aus !
Buttons sollen meist rechts oder zentriert unten gehalten werden ... alles Dinge die es unter DOS nicht gab, aber für ein "rundum gelungenes" GUI Fenster bedacht werden müssen.

PS: ich habe bisher recht statische Fenster mit unveränderbaren Rändern, je nach Anwendung ist das auch OK.
Gruß
Hubert
Benutzeravatar
satmax
1000 working lines a day
1000 working lines a day
Beiträge: 831
Registriert: Do, 02. Dez 2010 19:34
Wohnort: Biberbach in Österreich
Hat sich bedankt: 1 Mal
Danksagung erhalten: 1 Mal
Kontaktdaten:

Re: Migration von Clipper auf Xbase V2

Beitrag von satmax »

Eventsteuerung und Fenstertechnik habe ich in meinem CLipper Programm schon, teilweise auch Maussteuerung. Auch verwendet das Programm nicht 25 sondern 50 Zeilen im DOS Mode. Daher denke ich, Hybrid wenn nicht gar GUI muss es von Beginn an sein (eXpress).

Hier ein paar Source Fragmente aus meinem Clipper 5.2 Programm:

Code: Alles auswählen

LOCAL bBlock := {|w, n1, n2| WPaintIcon (w, n1, n2) }

  nExitMode:=0
  sFr    := getStammFrStru()
  sFrBak := getStammFrStru()

  oWindow := WindowNew (2, 1, 34, 78, CS_GRAPHICAL, NIL, ;
                        nFlags, NIL, NIL, NIL, NIL, ;
                        "n/b,w/b,,,*w/n,*w/w")

  oWindow:cargo := 0

  oWindow:syscolor:="n/b,w/b,RB/RB,,b/w,BG+/RB,BG+/RB"
  oWindow:title:="STAMMDATEN"

Code: Alles auswählen

	
    oWindow:callback := bBlock
    if ( Select ("ICONS") > 0 .or.;
         IcoFileOpen ( cIconPath + "clicons", "icons") )
      if ( oIcon1[1] == NIL )
        for nI := 1 to 2
          oIcon1[nI] := ICONS->(IcoDbfGet (aIcons1[nI,1],aICons1[nI,2]))
          oIcon2[nI] := ICONS->(IcoDbfGet (aIcons2[nI,1],aICons2[nI,2]))
        next
      endif
    EndIf

   SELECT fr_dat
   fr_dat->(DBSETORDER(2))
   fr_dat->(DBGOTOP())
   IF fr_dat->(EOF())          
      sFr:=StammFrRead(sFr,.f.)  // INIT
   ELSE              // OK?, DANN FELDER EINLESEN
      sFr:=StammFrRead(sFr,.t.)  // FELDER LESEN
   ENDIF

   open dialog dGetList ;
               eval {|a, nP1, nP2| EditFrCallb(a, nP1, nP2, sFr) }

Code: Alles auswählen

  @  1,1  TITLE "Kundennummer";
	     		COLOR cSayColor     ;
			DIALOG dGetList     ;
              GET  sFr:nkdnr ;
			PICT "99999";
			ID _KDNR;
			MESSAGE ""+cMyMsg;
			COLOR p_ArtikSayColr;
			DISABLE
...
  @ 28,14 TITLE "" ;
                        COLOR cSayColor ;
                         DIALOG dGetList     ;
               GET sFr:nMAUT9VKP    ;
                         PICT "99.999" ;
                         ID _MAUT9VKP    ;
                         MESSAGE " VK-Aufschlag in Prozent"+cMyMsg      ;
                         COLOR p_ArtikSayColr

   @ 24, 36, 28, MAXCOL()-2;
        DIALOG dGetList     ;
        EDIT sFr:mBEMERK ;
	ASCII;
	ID _BEMERK ;
	STYLE nFlagsMemo;
	MESSAGE " Notizfeld; verlassen mit Strg+";
        EVAL({|oEditor, nP1, nP2| myMiniEdit(oEditor, nP1, nP2, sFr)  }) ;
        COLOR p_ArtikSayColr;
        SYSCOLOR "w/b,w/w,w/b,,rb/n,w+/b,w/rb,b/w"

  @ MaxRow() -2, 1,MaxRow() -1, 12 ;
	DIALOG dGetList     ;
	pushbutton "~Tarife" ;
	ACTION {|w| w:owner:interaction(60000),xRet:=2  };
	MESSAGE " Tarifverwaltung";
	color "RG+/Rb,N/W*,  b,  b,n/b,N/Rb"

  @ MaxRow() -2, 13,MaxRow() -1, 16 ;
	DIALOG dGetList     ;
	pushbutton "<" ;
        ACTION {|w| w:owner:interaction(60001),xRet:=2  };
	MESSAGE " Vorw„rts";
	color "RG+/Rb,N/W*,b,b,n/b,N/Rb"

Code: Alles auswählen

        dialog dGetlist modal

// Sicherstellen das Fenster geschlossen ist.
	IF WSelect(oWindow) !=NIL
		WClose()
	ENDIF
Gruß
Markus
Antworten