PushButton

Alle Fragen um die Programmierung, die sich sonst nicht kategorisieren lassen. Von Makro bis Codeblock, von IF bis ENDIF

Moderator: Moderatoren

Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21186
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

Moin,

OK, noch eine Verständnisfrage: Wenn ich jetzt direkt die Felder eintrage in die Datalinks, womit arbeite ich denn dann? Mit den Feldern, (so wie es eingetragen ist) oder mit zwischengeschalteten Getvariablen? Wenn ich die Felder dann ändere, wird dann nicht direkt in die DB geschrieben?

Muß ich jetzt erstmal testen....
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16508
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Hallo Manfred,
wenn Du die Felder einträgst, wird direkt mit den Feldern gearbeitet!
Zurückgeschrieben wird in meinem letzten Beispiel nie etwas, da die Zuweisung in die Datenbank aus dem :datalink herausgenommen wurde (Du wolltest ja nur Anzeigen!!).

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21186
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

Moin Martin,

ich habe das mal ausprobiert. Ich komme nicht klar damit. Das kann doch so nicht wirklich geplant sein? Wie ist es denn, wenn ich editieren will? Wie ist es, wenn ich den Schlüsselkey einer andere DB abspeichern will? Es muß doch irgendwie möglich sein hier so zu agieren, wie ich es vom Textmodus her gewöhnt bin, nur eben auf grafischer Oberfläche? Also die Felder aus Variablen bearbeiten? Was ist denn los, wenn ich nur Variablen bearbeiten will?

ich glaube ich verstehe hier irgendwas überhaupt nicht, oder schlichtweg falsch.

Vor allen Dingen kriege ich die Buttons nicht aktiviert, ohne sie direkt mit TAB anzuspringen und dann nur über die Leertaste.

Au man, ist das alles kompliziert für Umsteiger....
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16508
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Hallo Manfred,
wenn Du nun doch auch schreiben können willst, dann mach' es so, wie zuerst von mir propagiert.
In diesem Fall ohne den Umweg über Variablen zu wählen!
Willst Du unbedingt den Weg über extra Variablen nehmen, so mußt Du Dir die Funktionalität gather() und scatter() im Prinzip selber schreiben - ist aber nicht schwer!
Du baust Dir eine Methode :schreibe(), in der Du folgendes machst:

Code: Alles auswählen

dbffile->bew := ::bew
dbffile->name := ::name
....
Und Du baust Dir eine Methode :lese(), in der Du folgendes machst:

Code: Alles auswählen

::bew := dbffile->bew
::name := dbffile->name
....
Dann nutzt Du diese beiden Methoden in Deinen :activate-Blöcken Deiner Knöpfe entsprechend und änderst die :datalinks wieder ab (so wie am Anfang, als Du auf die Variablen gegangen bist).
Nur was soll Dir das gegenüber der Standardfunktionalität bringen??
Knöpfe werden grundsätzlich nur über die Leertaste (oder die Maus) aktiviert!! Wenn Du sie auch mit Return (oder mit Tastenkürzeln) aktivieren können willst, musst Du entsprechend in Deiner Eventabarbeitung (Deine DO WHILE .T.-Schleife) dies einprogrammieren! Also bei drücken der gewünschten Tastenkombination oder bei ausgewähltem Knopf und drücken von XbeK_RETURN ein entsprechendes PostAppEvent(xbeP_Activate, NIL, NIL, ::oPbrw) an den jeweiligen Knopf (in diesem Fall den Knopf ::oPbrw) schicken.

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21186
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

Hi Martin,

wir kommen der Sache immer näher. Das mit der Gather und Scatter Selbstprogrammierung habe ich ja schon, aber irgendwie lief/läuft das nicht so wie ich will. Aaaaber, ich bin heute stur, ich werde es hinkriegen. Ich teste gerade etwas und werde mich gleich wieder melden.

Das mit den Variablen, nun, wenn ich doch mit den Feldern direkt arbeite, dann habe ich doch ein Problem, wenn ich nach Doubletten suchen will. In dem Moment, wo ich das Feld beschreibe, ist diese "Varia" doch schon in der DB selbst geschrieben und somit wird es immer gefunden werden als vorhanden? Oder ist es nicht so wie:

@ x,y GET field->bez
read

Sobald ich hier was reinschreibe, ist es in der DB und somit würde es immer gefunden werden. Ich denke deshalb benutzt man Speichervaria? Die Möglichkeit die Getzwischenvarias zu nutzen, habe ich noch nicht probiert. Das gibt es ja, sonst könnte man ja nicht ein Validate machen und die Werte verwerfen, ohne sie zu schreiben.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16508
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Hallo Manfred,
das Problem mit Dubletten (bei mir wird das Feld zbn auf Dubletten geprüft) habe ich so gelöst:
Am Anfang wird die DB geöffnet und alle zbn und recno()s in ein Array geschrieben:

Code: Alles auswählen

zbnummern := {}
do while .not. eof()
  aadd( zbnummern, { left( &dateiname->zbn + space( 30 ), 30 ), &dateiname->( recno() ) } )
  skip
enddo
asort( zbnummern,,, {|aX,aY| aX[1] < aY[1] } )   // Array alphabetisch sortieren
Nach Dubletten wird dann so gesucht:

Code: Alles auswählen

i := ascan( zbnummern, {|a| a[ 1 ] == left( obj:EditBuffer() + space( 30 ), 30 ) } )
// suchen nach der eingegeben zbn (ist obj:EditBuffer() )
if i > 0
  if zbnummern[ i, 2 ] <> &dateiname->( recno() )
    doppelt := .t.
    o := zbnummern[ i, 2 ]
  else
    do while i > 0
      p := i + 1
      i := ascan( zbnummern, {|a| a[ 1 ] == left( obj:EditBuffer() + space( 30 ), 30 ) }, p )
      if i > 0
        if zbnummern[ i, 2 ] <> &dateiname->( recno() )
          doppelt := .t.
          o := zbnummern[ i, 2 ]
        endif
      endif
    enddo
  endif
  if doppelt
    if vorschau
      pieps()
      ::Gebdatum:SetData( "01011900" )
      ::Zbn:SetData( "siehe Datensatz " + alltrim( str( o ) ) )
      ::Coden:SetData( "999" )
      ::hcrtest( ::Coden )
      vorschau := .f.
    else
      vorschau := .t.
    endif
    SetAppFocus( obj )
    allesOK := .f.
    return .f.
  endif
else
  // die zbn wurde nicht gefunden
  asort( zbnummern,,, {|aX,aY| aX[2] < aY[2] } )   // Array nach recno()s sortieren
  i := ascan( zbnummern, {|a| a[ 2 ] == &dateiname->( recno() ) } )
  // nach recno() suchen
  if i > 0
    zbnummern[ i, 1 ] := left( obj:EditBuffer() + space( 30 ), 30 )
    // geaenderte zbn ins Array speichern
  else
    aadd( zbnummern, { left( obj:EditBuffer() + space( 30 ), 30 ), &dateiname->enr } )
    // neuen Eintrag hinzufuegen
  endif
  asort( zbnummern,,, {|aX,aY| aX[1] < aY[1] } )   // Array alphabetisch sortieren
endif
Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21186
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

So, jetzt klabbet so wie ich es mir vorstelle.

Zumindest mit dem Skippen.

Code: Alles auswählen

::oPbvw:activate := {|| (::nArea)->(DbSkip(-1)), ::readREcord(self), ::setData(), ::oAkpdlg:show() }

********************************************************************************
METHOD ankaufpreisparameter:setData
       AEval( ::aEditControls, { |o| o:setData() } )
RETURN self
Ich weiß jetzt nur nicht, ob das Anzeigen auf diese Art ein schöner Weg ist. Es flackert kurz, was auch nachvollziehbar ist von mir, aber es klappt.

Ach so, bevor ich es vergesse, Die Buttons kann ich per Mausklick nicht ansprechen, oder sagen wir mal so, ich kann sie nicht aktivieren. Ich lande immer auf dem 1.Button, von da aus kann ich weiter per TAb, muß aber immer mit Leertaste aktivieren um den Drückeffekt zu sehen. Mit der Maus geht gar nichts. Mal sehen, ob ich da was finde.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21186
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

Hi Martin,

etwas zeitverschoben. Dein Vorschlag mir den Doubletten. Ich habe nur kurz drübergeschaut. Liest Du alle Sätze ein, oder wie verstehe ich das ? Ich habe mal aus GAG eine Listbox mit einer größeren Datenbank gemacht und diese dann eingelesen.......

Es geht bei den DB um einige 100.000 Sätze, ich brauche hier nicht zu sagen, wie lange man bei einem Skip unterwegs ist ;-)
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16508
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Hallo Manfred,
was macht Dein ::readRecord()? Das ::aEditControls füllen?
Nimm mal das ::oAkpdlg:show() am Ende weg, dann flackert es auch nicht mehr!
Wenn Du natürlich nicht direkt auf die Felder gehst, sondern auf die Variablen, mußt Du in Deiner ::setData() nach dem AEval() die einzelnen Controls refreshen:

Code: Alles auswählen

AEval( ::aEditControls, { |o| o:invalidaterect() } )
Sollte klappen!
Zu Deiner zweiten Frage: Ja, aber ich lege nur zwei Daten (zbn und Datensatznummer) im Array ab. Die Suche nach Dubletten geht dann darüber schneller (da im Hauptspeicher).

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21186
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

Hi Martin,
Hallo Manfred,
was macht Dein ::readRecord()? Das ::aEditControls füllen?
::readREcord macht das, wofür Hubert so eine superschnelle Lösung gebaut hat....

Es durchläuft einfach nur eine Schleife und liest alle Feldinhalte in entsprechende Variablen mit gleichem Namen. Das gleiche geht mit schreiben und Felderleeren ::writerecord() ::felderleeren(). So brauche ich mich um nichts mehr zu kümmern.
Nimm mal das ::oAkpdlg:show() am Ende weg, dann flackert es auch nicht mehr!
Habe ich gemacht, danke, das ist besser.
Wenn Du natürlich nicht direkt auf die Felder gehst, sondern auf die Variablen, mußt Du in Deiner ::setData() nach dem AEval() die einzelnen Controls refreshen:

Code: Alles auswählen

AEval( ::aEditControls, { |o| o:invalidaterect() } )
Sollte klappen!
Ich meine verstanden zu haben, das noch ein o:setData() dazwischen muß, jedenfalls klappt es bei mir jetzt so.
Zu Deiner zweiten Frage: Ja, aber ich lege nur zwei Daten (zbn und Datensatznummer) im Array ab. Die Suche nach Dubletten geht dann darüber schneller (da im Hauptspeicher).
Hm, na gut, nehme ich jetzt mal so hin.....
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21186
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

Zu meiner Frage mit den Pushbuttons und der Aktivierung:

Code: Alles auswählen

       nEvent := 0
       DO WHILE .T.
          nEvent := AppEvent( @mp1, @mp2, @oXbp)
          @oXbp:HandleEvent( nEvent, mp1, mp2 )
       ENDDO .T.
ich übergebe doch mit dem oXbp die Pushbottons, oder?
Wenn dem so ist, wie ist es denn, wenn jeder Pushbutton einen anderen Namen hat? Oben wird ja angenommen, dass es immer der gleiche Name ist und die einzelnen Buttons nacheinander dort reingeschrieben werden. Das wird sicherlich der Grund sein, warum ich da nicht auf normalem Wege dran komme um die zu drücken?
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: PushButton

Beitrag von AUGE_OHR »

moin,
Manfred hat geschrieben: Ich lade die gesamten Felder einer DB in Speichervariablen, bearbeite sie und speichere sie dann wieder zurück in die DB. So weit, so gut.

Code: Alles auswählen

...
oKDNR:dataLink := VARBLOCK(@mKDNR)
...
oName:dataLink := VARBLOCK(@mName)
...
FUNCTION  VARBLOCK( uMem )
DO CASE
   CASE VALTYPE(uMem) = "D"
      bblock := {|x| IIF( x==NIL, DtoC(uMem) , uMem := CtoD(x) ) }
   CASE VALTYPE(uMem) = "C"
      bblock := {|x| IIF( x==NIL, uMem , uMem := x ) }
   CASE VALTYPE(uMem) = "N"
      bblock := {|x| IIf( x==NIL, Transform( uMem, '@N' ),;
                                               uMem := Val(x) ) }
   OTHERWISE
      bblock := {|x| IIF( x==NIL, uMem , uMem := x ) }
ENDCASE
RETURN bblock
ABER damit ist dein datalink nach eingabe von Daten nicht automatisch
active ! erst durch ein o:getdata() wird der Codeblock aktiviert was auch
bei GATHER(aEditControls) für alle eingesammelten AADD(aEdit..,oKDNR)
passiert. damit hast du dann die Inhalt der SLE in den "Memvar".

wenn du nun "abhängige" SLE hast werden diese nicht "automatisch"
angezeigt sodern müssen erst durch o:setdata() "aktiviert" werden.
bei SCATTER(aEditControls) bekommst du somit sowas wie refreshAll

siehe : C:\ALASKA\XPPW32\SOURCE\SYS\BLOCKS.PRG

klar das du das lesen/schreiben der "Memvar" von/in die DBF dann
weiterhin brauchst.

da du mit "ClassCode" arbeitest sollten deine "Memvar" ja MDI fähig
sein ansonsten kann man auch "Procedure Code" und "Memvar" mittels :

#xtranslate mKDNR => Stack\[nSP, 1]
#xtranslate mNAME => Stack\[nSP, 2]

in ein 2-Dim Array portieren und seine Cl*pper STORE/REPLACE
Routinen behalten und MDI fähig machen (nSP = Nr MDI Fenster)
was den umstieg auf GUI einfacher macht.

gruss by OHR
Jimmy
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21186
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

Hi Jimmy,

bitte nicht soviel auf einmal.... :shock:

MDI, da denke ich überhaupt noch gar nicht dran... Ich wäre froh, wenn ich erstmal meine Textmasken gegen GUI austauschen kann. :?

Das was Du da schreibst, muß ich erstmal gaaanz vorsichtig auf der Zunge zergehen lassen.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16508
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Hallo Manfred,
Manfred hat geschrieben:Zu meiner Frage mit den Pushbuttons und der Aktivierung:
probiere es doch mal so:

Code: Alles auswählen

nEvent := 0
DO WHILE .T.
  nEvent := AppEvent( @mp1, @mp2, @oXbp)
  if ( mp1 == xbeK_ENTER ) .and. oXbp:isDerivedFrom("xbpPushButton")
    PostAppEvent(xbeP_Activate,,, oXbp)
  else
    @oXbp:HandleEvent( nEvent, mp1, mp2 )
  endif
ENDDO .T.
Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Hallo Martin und Manfred,

was habt Ihr immer mit show und invalidrect ?
Das macht ein SLE bei der Zuweisung von neuen Daten automatisch und somit doppelt. Manfred ich nutze bei fast allen Programmen die Technik mit den zwischengespeicherten Variablen, hauptsächlich weil ich Plattenzugriffe von der Eingabe des ganzen Satzes trennen will. Erst wenn der gesammte Satz eingegeben und validiert ist, wird was gespeichert (auf Druck eines Pushbuttons).

Die Lösung von Martin mit dem Datalink direkt in die Datei hat natürlich auch seine Berechtigung, wenn dieses Verhalten gewünscht ist z.B. bei einem DBU ähnlichen Programm ...

Den datalink habe ich in meinen Programmen nie ausgefüllt, das mache ich direkt mit

oSLE:setData( Datenfeld oder IVar ist egal ) // für jedes Feld einzeln oder mit aeval(::aEditControls()...) wenn definiert. Das SLE zeigt seinen neuen Inhalt SOFORT an.
oSLE:getData() oder oSLE:getEditBuffer() holt den aktuellen Inhalt wieder aus dem Feld heraus, diesen einer iVar oder einem Feld zuweisen.
Den Pushbutton:activate( {|| ::back() etc. } zuweisen und dort dann wenn gewünscht vor der Skip ::save() und danach ::load() aufrufen.

Diese Vorgehensweise entspricht eher einem Clipperdenken und man weiß genau was das Programm wann macht.
Gruß
Hubert
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Hallo Manfred,

für Martins (Alaskas...) Lösung mit den Codeblock etc. ist es am einfachsten du gehst in den XppFD und setzt dort die SLE nicht direkt (ohne Anbindung) sondern über das Menü Assistenten-Felder, dann werden alle Codeblocks ausgefüllt, genauso mit den Pushbuttons , dort OK für Ende mit Speichern, Abbruch für ESC, Erster ....

Dann werden die Vorgaben so sein, dass das Fenster direkt auf der DBF arbeitet und du siehst, wie es sein soll, wenn man diese Technik nutzt.

Dann kann man die datalinks natürlich auf Variablen ändern, muß dann aber fürs richtige Speichern die gekannten Befehle einbinden. Unter Clipper ging auch nicht automatisch. Wichtig ist nur den Unterschied zu begreifen, dass man nun den Anwender nicht zwingen kann genau eine Taste zu drücken. Alle Tasten die man nicht will, muß man disablen und man muß überall die Funktionalität hinterlegen (Controls Fenster) die man anbieten will.
Gruß
Hubert
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21186
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

Hi Hubert,

wie sollte es auch sein ;-) es klappt auch so, wie Du es beschrieben hast. Komisch, irgendwo habe ich gestern etwas falsch gemacht, es ging nicht. Aber egal, Hauptsache ist es klappt jetzt.

Das Skippen und dann Anzeigen läuft also.

Jetzt muß ich mich mit den Pushbuttons beschäftigen.

Das macht alles schwer süchtig....

Jetzt finde ich überhaupt kein Ende mehr...

Bis hierhin schonmal Danke für eure Hilfe.... aaaber ich habe noch etliche Fragen. Egal, kommt später, jetzt wird erst einmal angpaßt und umgebaut. Bis gleich ;-)

:wav:
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Hallo Manfred,

die Umstellung von DOS-Clipper (ich überwache jeden Tastendruck) hin zu Win32 Programmierung (der Anwender darf überall draufklicken wo er will, mein Programm muß damit fertig werden) ist hart, egal mit welcher Programmiersprache du dran gehst.

Aber es lohnt sich, ich wollte nicht mehr auf meine Xbp verzichten und mit 24x80 Zeichen SAY und GET programmieren.
Früher war ich auf mein selbstgeschriebenes MemoEdit in PowerBasic stolz (ich bin es immer noch ...), heute bin ich froh, dass ich die Controls out of windows fix und fertig bekomme ... und notfalls mit Vererben einfach das Verhalten ändern kann.
Gruß
Hubert
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21186
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

Hi Hubert,

was meinst Du warum ich im Moment vor lauter lachen nicht in den Schlaf komme?

Es macht richtig Spaß, aber wie Du sagst es ist recht viel zu beachten und am Anfang muß man sehr viel programmieren, bis man durchblickt, wie alles vereinfacht werden könnte.
Das schöne daran ist ja, das mit jedem Neuen, wieder etwas dazukommt, zu dem man sagt, "Ach, das mache ich gleich mit, wenn das so läuft..."
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16508
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Hallo Hubert,
brandelh hat geschrieben:oSLE:setData( Datenfeld oder IVar ist egal ) // für jedes Feld einzeln oder mit aeval(::aEditControls()...) wenn definiert. Das SLE zeigt seinen neuen Inhalt SOFORT an.
Du hast natürlich recht - ein SetData() führt automatisch ein :invalidaterect() für das entsprechende Control aus...

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21186
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

Hm,

Code: Alles auswählen

METHOD ankaufpreisparameter:maskeGui()
       LOCAL nEvent, mp1, mp2
       LOCAL nPBAbstand    := 20
       LOCAL nPBAnfang     := 35
       LOCAL nAbzugHoehe
       LOCAL nDlgBreite    := 900
       LOCAL nDlgHoehe     := 470
       LOCAL nGruppeBreite := nDlgBreite - 10
       LOCAL nGruppeHoehe  := nDlgHoehe - 10
       LOCAL nTextbreite
       LOCAL nPBBreite

       ::aEditControls    := {}
       ::aPBcontrols := {}

       ::oAKPDlg          := XbpDialog():new(SetAppWindow(),,,{nDlgBreite,nDlgHoehe},,.F.)
       ::oAKPDlg:titlebar := .F.
       ::oAKPDlg:create()
//       oAKPDlg:setFontCompoundName("10.Helv.bold")
       CenterControl(::oAKPDlg)
       ::oAKPDlg:show()                                                           // nachdem es positioniert wurde

       ::oButtonGroup         := XbpStatic():new(::oAKPDlg,,{0,0},{nGruppeBreite,50})
       ::oButtonGroup:type    := XBPSTATIC_TYPE_GROUPBOX
       ::oButtonGroup:create()

       nPbBreite        := 70
       ::oPbNeu         :=  XbpPushButton():new(::oButtonGroup,,{nPBAnfang,5},{nPBBreite,20})
       ::oPbNeu:caption := "~Neu"
       ::oPBNeu:tabStop := .T.
       ::oPBNeu:group   := XBP_BEGIN_GROUP
       ::oPbNeu:create()
       ::oPbNeu:activate := {|| ::setzePushButtonStatus("neu"), ::felderleeren(self), ::setData() }
       AAdd( ::aPBControls, ::oPbNeu)

       nPBAnfang           += nPBBreite + nPBAbstand
       ::oPbSuchen         :=  XbpPushButton():new(::oButtonGroup,,{nPBAnfang,5},{nPBBreite,20})
       ::oPbSuchen:caption := "~Suchen"
       ::oPBSuchen:tabStop := .T.
       ::oPBSuchen:group   := XBP_WITHIN_GROUP
       ::oPbSuchen:create()
       ::oPbSuchen:activate := {|| ::setzePushButtonStatus(),::felderleeren(self), ::setData() }
       AAdd( ::aPBControls, ::oPbSuchen)

       nPBAnfang         += nPBBreite + nPBAbstand
       ::oPbEdit         :=  XbpPushButton():new(::oButtonGroup,,{nPBAnfang,5},{nPBBreite,20})
       ::oPbEdit:caption := "Ä~ndern"
       ::oPBEdit:tabStop := .T.
       ::oPBEdit:group   := XBP_WITHIN_GROUP
       ::oPbEdit:create()
       ::oPbEdit:activate := {|| ::readREcord(self) }
       AAdd( ::aPBControls, ::oPbEdit)

       nPBAnfang        += nPBBreite + nPBAbstand
       ::oPbTop         :=  XbpPushButton():new(::oButtonGroup,,{nPBAnfang,5},{nPBBreite,20})
       ::oPbTop:caption := "<<"
       ::oPBTop:tabStop := .T.
       ::oPBTop:group   := XBP_WITHIN_GROUP
       ::oPbTop:create()
       ::oPbTop:activate := {|| ::setzePushButtonStatus(),(::nArea)->(DbGoTop()), ::readREcord(self), ::setData() }
       AAdd( ::aPBControls, ::oPbTop)

       nPBAnfang     += nPBBreite + nPBAbstand
       ::oPbrw         :=  XbpPushButton():new(::oButtonGroup,,{nPBAnfang,5},{nPBBreite,20})
       ::oPbrw:caption := "<"
       ::oPBrw:tabStop := .T.
       ::oPBrw:group   := XBP_WITHIN_GROUP
       ::oPbrw:create()
       ::oPbrw:activate := {|| ::setzePushButtonStatus(),::skiprw(), ::setData() }
       AAdd( ::aPBControls, ::oPbrw)

       nPBAnfang     += nPBBreite + nPBAbstand
       ::oPbvw         :=  XbpPushButton():new(::oButtonGroup,,{nPBAnfang,5},{nPBBreite,20})
       ::oPbvw:caption := ">"
       ::oPBvw:tabStop := .T.
       ::oPBvw:group   := XBP_WITHIN_GROUP
       ::oPbvw:create()
       ::oPbvw:activate := {||  ::setzePushButtonStatus(),::skipvw(), ::setData() }
       AAdd( ::aPBControls, ::oPbvw)

       nPBAnfang         += nPBBreite + nPBAbstand
       ::oPbBottom         :=  XbpPushButton():new(::oButtonGroup,,{nPBAnfang,5},{nPBBreite,20})
       ::oPbBottom:caption := ">>"
       ::oPBBottom:tabStop := .T.
       ::oPBBottom:group   := XBP_WITHIN_GROUP
       ::oPbBottom:create()
       ::oPbBottom:activate := {||  ::setzePushButtonStatus(),(::nArea)->(DbGoBottom()), ::readREcord(self), ::setData() }
       AAdd( ::aPBControls, ::oPbBottom)

       nPBAnfang       += nPBBreite + nPBAbstand
       ::oPbSave         :=  XbpPushButton():new(::oButtonGroup,,{nPBAnfang,5},{nPBBreite,20})
       ::oPbSave:caption := "S~peichern"
       ::oPBSave:tabStop := .T.
       ::oPBSave:group   := XBP_WITHIN_GROUP
       ::oPbSave:create()
       ::oPbSave:activate := {|| ::setzePushButtonStatus(),::readREcord(self),IIF(::lEdit,::writeRecord(self),::writeRecord(self,.T.)) }
       AAdd( ::aPBControls, ::oPbSave)

       nPBAnfang          += nPBBreite + nPBAbstand
       ::oPbEnde          :=  XbpPushButton():new(::oButtonGroup,,{nPBAnfang,5},{nPBBreite,20})
       ::oPbEnde:caption  := "~Ende"
       ::oPBEnde:tabStop  := .T.
       ::oPBEnde:group    := XBP_END_GROUP
       ::oPbEnde:create()
       ::oPbEnde:activate := {|| ::setzePushButtonStatus(),::readREcord(self) }
       AAdd( ::aPBControls, ::oPbEnde)

       nEvent := 0
       DO WHILE .T.
          nEvent := AppEvent( @mp1, @mp2, @::oAkpDlg)
          ::oAkPDlg:HandleEvent( nEvent, mp1, mp2 )
       ENDDO .T.
       altd()
       ::oAkPDlg:destroy()
so klappen die Pushbuttons. Sobald aber sowas hier mit drin ist,

Code: Alles auswählen

       nTextbreite       := 200
       nAbzughoehe       := 50
       ::oStatic         := XbpStatic():new(::oGruppe,,{5,nGruppeHoehe-nAbzugHoehe},{nTextbreite,20})
       ::oStatic:caption := "Bezeichnung des Parameters:"
       ::oStatic:options := XBPSTATIC_TEXT_CENTER+XBPSTATIC_TEXT_VCENTER
       ::oStatic:create()

       ::oSle1              := XbpSLE():new(::oGruppe,,{nTextbreite+5,nGruppeHoehe-nAbzugHoehe,},{650,20})
       ::oSle1:bufferlength := 80
       ::oSle1:tabStop      := .T.
       ::oSle1:dataLink     := {|x| IIF(x==NIL , ::bez, ::bez := LTrim(x))}
       ::oSle1:create():setData()
       AAdd( ::aEditControls, ::oSle1)
kann ich die Buttons nicht mehr mit der Maus ansprechen
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16508
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Manfred,
lass doch mal Dein ganzes "Group-geraffel" weg :wink:

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21186
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

Hi Martin,

ich hätte jetzt große Lust einen Riesenfluch vom Stapel zu lassen. Die Gruppen waren es nicht wirklich, aber nachdem ich die Gruppenbildung alle an den Anfang gestellt habe, scheint es zu klappen. Manoman, diese Bastelei.
Also scheint die Reihenfolge wohl nicht ganz egal zu sein.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16508
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Hallo Manfred,
na dann ist es doch OK.
Ich habe nur nicht verstanden, wozu Du die ganzen Knöpfe gruppieren willst, ist doch eigentlich unnötig, oder?

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21186
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

Hi Martin,

meinst Du jetzt warum ich die in eine Gruppe oButtonGruppe reinpacke?

Nun, ich habe ganz am Anfang alles einzeln auf den Bildschirm gesetzt. Dann habe ich irgendwann mal die SAche mit den Gruppen mitbekommen und da war mir klar, -> Container. Alles was in einer Gruppe ist, bezieht sich nur auf die Maße in der Gruppe und kann dann mit der ganzen Gruppe vergrößert, verkleinert und/oder verschoben werden. Das finde ich prima und erleichtert mir die Sache.

Oder meinst Du :group?

Nun, das weiß ich auch nicht so ganz. Habe ich gelesen und dachte bei mir, hört sich gut an. Irgenwie hat das doch mit der Reihenfolge der Aktivierung zu tun? Wenn nicht, ja dann.....
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Antworten