xbpmenu

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

Moderator: Moderatoren

Antworten
Benutzeravatar
Koverhage
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2471
Registriert: Fr, 23. Dez 2005 8:00
Wohnort: Aalen
Hat sich bedankt: 103 Mal
Danksagung erhalten: 3 Mal
Kontaktdaten:

xbpmenu

Beitrag von Koverhage »

Hallo,

stehe mal wieder auf der Leitung

habe folgenden Code:

Code: Alles auswählen

aDirectory  := directory( "..\" + "Dokumente\*.pdf" )
nMaxLength := len(aDirectory)
if nMaxLength > 0
   for i := 1 to nMaxLength
      cDokument := aDirectory[i,1]
      x := len(cDokument)-4
      cDokument := substr(cDokument,1,x)
      oMenu:addItem( { cDokument, { || _showPDF(, "..\" + "Dokumente\"+cDokument+".pdf") },,XBPMENUBAR_MIA_OWNERDRAW }, BMP_PDF )
   next
endif
Im Ordner befinden sich 2 PDF Dateien, der Menu-Eintrag wird richtig angezeigt, aber es wird immer die gleiche PDF Datei angezeigt.

Wie kann ich das regeln, damit die richtige PDF Datei angezeigt wird ?
Gruß
Klaus
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9390
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 104 Mal
Danksagung erhalten: 363 Mal
Kontaktdaten:

Re: xbpmenu

Beitrag von Tom »

Hallo, Klaus.

Der Codeblock wird zur Laufzeit evaluiert, und da steht "cDokument" auf dem letzten gültigen Wert.

Code: Alles auswählen

bMenuBlock := &("{|"+cDokument+"|_showPDF(, "+"..\" + "Dokumente\"+cDokument+".pdf"+") }")
oMenu:addItem( bMenuBlock,,XBPMENUBAR_MIA_OWNERDRAW }, BMP_PDF )
Herzlich,
Tom
Benutzeravatar
Koverhage
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2471
Registriert: Fr, 23. Dez 2005 8:00
Wohnort: Aalen
Hat sich bedankt: 103 Mal
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: xbpmenu

Beitrag von Koverhage »

Hallo Tom,

das war mir irgendwie klar, spätestens als ich direkt auf das Array zugreifen wollte.
Schade habe gedacht das es eine simple Lösung gibt, mache das
jetzt so:

case i = 1
oMenu:addItem( { cDokument, { || _showPDF(, "..\" + "Dokumente\"+aDirectory[1,1]) },,XBPMENUBAR_MIA_OWNERDRAW }, BMP_PDF )

aber wie ich das gerade so schreibe, ich könnte doch die Nummer des Menüeintrages festellen und dementsprechend den Inhalt des
Array holen.
Werde das bei Gelegenheit mal prüfen, so reicht es mir erstmal.

Danke
Klaus
Gruß
Klaus
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9390
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 104 Mal
Danksagung erhalten: 363 Mal
Kontaktdaten:

Re: xbpmenu

Beitrag von Tom »

Ist Dir meine Lösung nicht simpel genug? Funktioniert auch in einer Schleife einwandfrei!
Herzlich,
Tom
Benutzeravatar
Koverhage
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2471
Registriert: Fr, 23. Dez 2005 8:00
Wohnort: Aalen
Hat sich bedankt: 103 Mal
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: xbpmenu

Beitrag von Koverhage »

Hallo Tom,

das hatte ich total überlesen :(

Mir ist gestern dann noch folgendes durch den Kopf gegangen (ist wahrscheinlich Mist was ich jetzt schreibe)

Die Variable cDokument ist local deklariert, das Menu wird in der Procedure createmenu aufgebaut in der die
Variable definiert ist, normal dürfte es die Variable überhaupt nicht mehr geben ?

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

Re: xbpmenu

Beitrag von AUGE_OHR »

hi,

nur mal eine Verständniss Frage :
Warum nimmst du für eine "simple Liste" ein XBPMENUBAR_MIA_OWNERDRAW ?
Was zeigst du den "optisches" an ? Icon mit dem PDF Inhalt ?
gruss by OHR
Jimmy
Benutzeravatar
Koverhage
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2471
Registriert: Fr, 23. Dez 2005 8:00
Wohnort: Aalen
Hat sich bedankt: 103 Mal
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: xbpmenu

Beitrag von Koverhage »

Hallo Tom,

habe gerade versucht Deine Lösung anzuwenden, bekomme aber Syntaxfehler in Macro.

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

Re: xbpmenu

Beitrag von AUGE_OHR »

hi,
Koverhage hat geschrieben:H
habe gerade versucht Deine Lösung anzuwenden, bekomme aber Syntaxfehler in Macro.
fehlt bei Tom bei :AddItem nicht der 1st Parameter "xCaption" (und dann erst bBlock) ?
gruss by OHR
Jimmy
Benutzeravatar
Koverhage
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2471
Registriert: Fr, 23. Dez 2005 8:00
Wohnort: Aalen
Hat sich bedankt: 103 Mal
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: xbpmenu

Beitrag von Koverhage »

Hi Jimmy,

bei Tom fehlt der erste Parameter, aber ich bekomme es trotzdem nicht hin.

Nun zu Deiner Frage
nur mal eine Verständniss Frage :
Warum nimmst du für eine "simple Liste" ein XBPMENUBAR_MIA_OWNERDRAW ?
Was zeigst du den "optisches" an ? Icon mit dem PDF Inhalt ?
es wird folgende Bitmap(BMP_PDF) angezeigt, hier wie der Menu-Eintrag aussieht

Bild Musterdokument

Gruß
Klaus
Gruß
Klaus
Benutzeravatar
Koverhage
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2471
Registriert: Fr, 23. Dez 2005 8:00
Wohnort: Aalen
Hat sich bedankt: 103 Mal
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: xbpmenu

Beitrag von Koverhage »

Hallo Jimmy,

sonst bekomme ich das schicke Menu

Bild

nicht hin.

Wobei ich hier das Problem (trotz der Hilfe) mit der Anzeige wenn ein Eintrag disabled ist, noch nicht in den Griff bekommen habe.

Klaus
Gruß
Klaus
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15703
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 70 Mal
Danksagung erhalten: 34 Mal
Kontaktdaten:

Re: xbpmenu

Beitrag von brandelh »

Hallo,

Tom hat oben im Makro "+" statt ' drinn was zu einem Macrofehler führt.

Zu deiner Frage, eigentlich ist die Local ja nur in der Funktion, aber durch den Codeblock entsteht eine weitere Referenz auf den Speicherbereich und somit wird das LOCAL ausgehebelt (detached locals).

Hier mein Vorschlag, ich hoffe ich vertippe mich jetzt nicht auch ;-)

Code: Alles auswählen

cPfad        := "..\Dokumente\"  // ein Pfad ist sicherer ! 
aDirectory  := directory( cPfad+"*.pdf" )
nMaxLength := len(aDirectory)
if nMaxLength > 0
   for i := 1 to nMaxLength
      cDokument := aDirectory[i,1]
      x := len(cDokument)-4
      cDokument := substr(cDokument,1,x)
      bCode := &("{|| _showPDF(, '"+cPfad+cDokument+".pdf') }")
      oMenu:addItem( { cDokument, bCode ,,XBPMENUBAR_MIA_OWNERDRAW }, BMP_PDF )
   next
endif
wichtig ist bei solchen Aktionen, dass Stringparameter in ' ' eingeschlossen werden, was dann mit den begrenzenden " " recht unübersichtlich wird, daher hier nochmals in rot " und normalen ':

&( "{|| _showPDF(, '"+cPfad+cDokument+".pdf') }" )

ohne die Klammern für den Codeblock gibt das dann

_showPDF(,'Datei1.pdf')
_showPDF(,'Datei2.pdf')
_showPDF(,'Datei3.pdf')

etc.

da das Ganze recht schnell unübersichtlich wird, habe ich früher zuerst den Text gebaut
und danach in einen codeblock umgewandelt:

Code: Alles auswählen

      cCode :=    "{|| _showPDF(, '"+cPfad+cDokument+".pdf') }"
      msgbox(cCode,"Prüfen !")
      bCode := &(cCode)
      // Testen
      eval(bCode,...)
PS: falls eine solche Funktion danach zur Laufzeit als fehlend gemeldet wird - sollte mit DLLs in Xbase++ eigentlich nicht vorkommen - muss man diese Funktion irgendwo im Programm nochmals erwähnen (anfordern):

Code: Alles auswählen

function IchWerdeNieAufgerufen()
      _FehlendeFunktion()
return NIL
Gruß
Hubert
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9390
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 104 Mal
Danksagung erhalten: 363 Mal
Kontaktdaten:

Re: xbpmenu

Beitrag von Tom »

Das Makro war online eingetippt und nicht ausprobiert. Grundsätzlich geht es aber immer so. Auf diese Art kann man auch z.B. Browser-Spalten innerhalb einer Schleife aufbauen und die Marked-/Selected-Codeblöcke von Schleifenvariablen abhängig machen, ohne in die Falle zu treten, dass die ja eigentlich erst zur Laufzeit evaluiert werden. Bei Captions z.B. hat man das Problem nicht, weil die Objekte ja in der Schleife erzeugt werden (es sei denn, die Captions sind wieder Codeblöcke).
Herzlich,
Tom
Benutzeravatar
Koverhage
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2471
Registriert: Fr, 23. Dez 2005 8:00
Wohnort: Aalen
Hat sich bedankt: 103 Mal
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: xbpmenu

Beitrag von Koverhage »

Danke an alle, werde das mal irgendwie umsetzen, aber noch eine Frage zu den detached locals
Werden diese überhaupt irgendwann freigegeben oder kann es da zu Speicherproblemen kommen?
Gruß
Klaus
Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 9390
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 104 Mal
Danksagung erhalten: 363 Mal
Kontaktdaten:

Re: xbpmenu

Beitrag von Tom »

Die LOCAL Variable ist keine mehr, weil sie "aufgelöst" Bestandteil des Codeblocks bzw. Makros wird. Und das wird freigegeben, wenn die Funktion beendet wird.
Herzlich,
Tom
Benutzeravatar
Koverhage
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2471
Registriert: Fr, 23. Dez 2005 8:00
Wohnort: Aalen
Hat sich bedankt: 103 Mal
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: xbpmenu

Beitrag von Koverhage »

Habe es jetzt mit Huberts Variante gemacht, läuft. =D>
Jetzt muss ich nur noch ein vernünftiges Limit für die Anzahl finden, da es sonst zu unübersichtlich wird und natürlich die
Menu-Einträge nicht über das Bildschirmende hinausgehen sollten ;-)
Die Menu-Einträge sollen ja nur als Schnellstart für die am häufigsten genutzten PDF Dateien dienen.
Gruß
Klaus
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15703
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 70 Mal
Danksagung erhalten: 34 Mal
Kontaktdaten:

Re: xbpmenu

Beitrag von brandelh »

Hi,

ich habe bei meinen Programmen ein Menüpunkt 'Hinweise' und starte daraus ein Fenster mit einer Listbox. In dieser werden alle Namen vorhandener PDFs angezeigt und können gestartet werden.
Dies ermöglicht mir eine sofortige Anpassung der Hinweistexte bzw. die Erstellung von neuen ohne das Programm ändern zu müssen.
Gruß
Hubert
Benutzeravatar
Koverhage
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2471
Registriert: Fr, 23. Dez 2005 8:00
Wohnort: Aalen
Hat sich bedankt: 103 Mal
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: xbpmenu

Beitrag von Koverhage »

Hubert,

so habe ich das im Menu und ist ein Tick schneller ;-) Ich schätze mal das es höchsten 5 PDF Dateien sind die unsere
Kunden so über den "Schnellzugriff" aufrufen, bei manchen eher weniger denn Lesen strengt so an und man wird so schnell müde :lol:
Gruß
Klaus
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15703
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 70 Mal
Danksagung erhalten: 34 Mal
Kontaktdaten:

Re: xbpmenu

Beitrag von brandelh »

Hallo Klaus,

das mit dem Menü ist je nach Datei ja auch wirklich nett, aber neue PDF
z.B. auch Arbeitsanweisungen des Kunden selbst sind bei mir schnell eingebunden,
ohne das Programm ändern zu müssen (das müsste installiert werden :-( ).

Ich kann hier halt sofort die PDFs im Datenverzeichnis austauschen, ergänzen oder ändern.
Eine Programminstallation muss ich beauftragen und da gehen durchaus auch 8 Wochen ins Land ...
Und die Verwaltungen, die meine Programme einsetzen haben öffters zusätzlich noch Arbeitsanweisungen für Ihre Leute im Angebot ;-)
Gruß
Hubert
Benutzeravatar
Koverhage
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2471
Registriert: Fr, 23. Dez 2005 8:00
Wohnort: Aalen
Hat sich bedankt: 103 Mal
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: xbpmenu

Beitrag von Koverhage »

Hallo Hubert,

ja das ist der Sinn, beim Programmstart das Verzeichnis Dokumente nach PDF Dateien durchsucht und die gefundenen
als Menu-Eintrag angelegt.
Dies sind zum größten Teil Gesetze, Verordnungen, fremde Handbücher, etc.
Diese brauchen ja nicht installiert werden.
Bisher ist es so, liegt alles auf dem Desktop, der Anwender muss die Anwendung minimieren, erstmal suchen wo es auf dem Desktop liegt, oder über Arbeitsplatz.
So ruft er das einfach aus unserer Anwendung heraus auf.
Gruß
Klaus
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12913
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 46 Mal

Re: xbpmenu

Beitrag von AUGE_OHR »

hi,
Koverhage hat geschrieben: sonst bekomme ich das schicke Menu nicht hin.
ah ja verstehe ... aber warum ins Menu ?
Es gibt doch auch eine Ownerdraw Listbox ... und meine PBStack Class :)
Koverhage hat geschrieben: Wobei ich hier das Problem (trotz der Hilfe) mit der Anzeige wenn ein Eintrag disabled ist, noch nicht in den Griff bekommen habe.
habe ich dazu nicht mal was in die Wissensbasis geschrieben ?
sonst einfach nochmal einen neuen Thread eröffnen und die Frage nochmals stellen.
gruss by OHR
Jimmy
Benutzeravatar
Koverhage
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2471
Registriert: Fr, 23. Dez 2005 8:00
Wohnort: Aalen
Hat sich bedankt: 103 Mal
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: xbpmenu

Beitrag von Koverhage »

Hi Jimmy,
habe ich dazu nicht mal was in die Wissensbasis geschrieben ?
sonst einfach nochmal einen neuen Thread eröffnen und die Frage nochmals stellen.
ich meinte ja trotz Deiner Hilfe habe ich das nicht hinbekommen.
Ich suche das nochmal zusammen.

Gruß
Klaus
Gruß
Klaus
Antworten