Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Enum durchschleifen? (VB: FOR EACH x IN y)

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC.
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
Mae



Anmeldungsdatum: 04.06.2008
Beiträge: 26

BeitragVerfasst am: 05.08.2008, 15:06    Titel: Enum durchschleifen? (VB: FOR EACH x IN y) Antworten mit Zitat

Manchmal ist es fürchterlich nützlich die enumerieten Konstanten noch einmal durchzublättern. Daher gibt es auch in VB tatsächlich meines wissens eine Lösung dafür.
Doch in FB kann ich das leider nicht anwenden - oder?

Beispiel: in FreeImage.bi werden die Dateiformate die unterstützt werden als Enum deklariert, damit man diese anstatt Nummern mit Namen ansprechen kann. Dabei wurde funktionen dieser Enum-Typ zugewiesen.
Möchte man wissen welche Datei-Formate die aktuelle DLL wirklich gerade unterstützt ist es nicht möglich eine Schleife mit einem Zahlenwert (egal ob integer oder was auch immer) zu durchlaufen - es wird nämlich der Enum-Type erwartet.
...zumindest finde ich keine Lösung... mit den Augen rollen
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1876
Wohnort: D59192

BeitragVerfasst am: 05.08.2008, 20:01    Titel: Antworten mit Zitat

Zitat:
Manchmal ist es fürchterlich nützlich die enumerieten Konstanten noch einmal durchzublättern.
Das kann man dann in der FreeImage.bi nachsehen.
Hier eine individuelle Lösung:
Code:
Width 80,40
Dim zeile As String
Dim ok As integer
Open "freeimage.bi" For Input As #1
DO
   LINE INPUT #1, zeile
   If instr(LCase(zeile),LCase("enum FREE_IMAGE_FORMAT")) Then ok=1
   If ok = 1 Then PRINT zeile
   If instr(LCase(zeile),LCase("end enum")) Then ok=0
LOOP UNTIL EOF(1)
Close #1
Sleep
end
(evtl. den Pfad auf die "freeimage.bi" anpassen.) grinsen
_________________
Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Mae



Anmeldungsdatum: 04.06.2008
Beiträge: 26

BeitragVerfasst am: 06.08.2008, 12:57    Titel: Pfiffig aber leider nicht akzeptabel... Antworten mit Zitat

grinsen Eine wirklich pfiffige Lösung!! - ganz ohne Frage.
Allerdings nicht das was ich wollte.
Und wenn man es mal weiter betrachtet:
Was ist aber, wenn die Exe-Datei ausgeliefert wird?
Die komplette Entwicklungsumgebung immer mit auf den Kunden-Rechner schleifen?

Muß ich meinen Freunden immer die ganzen Biblotheken, Wrapper oder wie auch immer mit ausliefern? - Oh jeh: Ich weiß nicht welches Installationsprogramm ich da nehmen soll.

Vermutlich heißt die nächste Idee: Binde es in die Resourcen ein.
Aber da ja die BI und die DLL auch nicht immer so zusammenspielen wie so sollen: Versionsunterschiede - bindet man am besten alles ein.
Wozu dann überhaupt noch eine DLL?
Wollte man damit nicht Plattenplatz sparen?

Vermutlich werd' ich genau das machen, was Du bereits gemacht hast mit der FreeImage393 - Die BI so umschreiben das diese einfach ein Stück weiter Flexible wird:
Die Funktion "FreeImage_GetFormatFromFIF" erwartet den Parameter "FREE_IMAGE_FORMAT" - ein Enum-Typ! - diese Funktion ist brauchbar, wenn man sich auflisten lassen möchte welche Plugins die FreeImage.DLL unterstützt. Also welche Bilderformate bzw. Dateiendungen die aktuelle Version unterstützt.
Für den "Datei-Öffnen"-Dialog möchte ich das nun gerne erfahren, damit ich das File-Pattern richtig vor einstellen kann - und ein unerfahrener User nicht alle (un-)möglichen Dateien als Bilder öffnet.

Anscheinend bietet sich nur die Lösung indem man die BI mit einem Funktions-Overload(?) ausstattet, die es dieser Funktion auch erlaubt einen Integer-Wert anstatt nur den Enum-Typ zu unterstützen.
Dann kann man in einer Schleife abfragen welche Dateien Unterstützt werden...

Doch vielleicht hast Du noch jemand wieder eine Überraschende Idee, wie es noch leichter geht? Noch kann ich auch nicht beweisen ob ich überhaupt recht habe mit meiner Theorie...

Komm einfach nicht hinter all dem her, was ich gerne schreiben möchte.
Auf der anderen Seite warte ich natürlich auch noch darauf das mehr VB eigenschaften in FB ermöglicht werden...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1876
Wohnort: D59192

BeitragVerfasst am: 06.08.2008, 15:22    Titel: Antworten mit Zitat

Hi,
ich verstehe schon was du damit bezwecken willst aber...

Woher kennt VB die enumerieten Konstanten? .. aus dem Wrapper MFreeImage.bas.
Wird eine alte Version der MFreeImage.bas verwendet um eine neuere DLL anzusprechen, kennt sie die neuen Konstanten natürlich nicht (in der dll werden diese enumerieten Konstanten nicht namentlich angegeben).
Bei einer Versionsänderung muss also auch in VB eine neue Version mit neuem Wrapper compiliert werden?
Oder versteh ich das jetzt ganz verkehrt?

Dein Problem
Zitat:
Die Funktion "FreeImage_GetFormatFromFIF" erwartet den Parameter "FREE_IMAGE_FORMAT" - ein Enum-Typ! - diese Funktion ist brauchbar, wenn man sich auflisten lassen möchte welche Plugins die FreeImage.DLL unterstützt. Also welche Bilderformate bzw. Dateiendungen die aktuelle Version unterstützt.
Für den "Datei-Öffnen"-Dialog möchte ich das nun gerne erfahren, damit ich das File-Pattern richtig vor einstellen kann - und ein unerfahrener User nicht alle (un-)möglichen Dateien als Bilder öffnet.

lässt sich auch mit der FreeImage393.bi in FB einfach lösen:
Code:
#Include Once "FreeImage393.bi"
Screen 19,32
Dim As String fiFormat
For i As Integer = 0 To 50
  fiFormat= *FreeImage_GetFormatFromFIF(i)
  If fiFormat="" Then Exit for
  Print i;" = ";fiFormat,
Next
print
Sleep
Einfach mal probieren grinsen
_________________
Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Mae



Anmeldungsdatum: 04.06.2008
Beiträge: 26

BeitragVerfasst am: 06.08.2008, 22:40    Titel: Antworten mit Zitat

"MFreeImage.bas" ? *schulterzuck* ? ...meinst Du jetzt das eigene Programm - finde "MFreeImage.bas" nirgends bei mir...

Da ich gar nicht genau weiß, was ein Wrapper tut (hab nur den Begriff gehört und in Verbindung mit dem Zeugs gebracht) peinlich
weiß aber gar nicht wirklich wozu das alles da ist...

Meine Vermutung, (die ich vielleicht gar nicht aufstellen darf) wäre: Solange die Funktion sich nicht grundlegend ändert, wäre der Wrapper (und ich dachte das wäre die *.a-Datei) weiterhin nutzbar. Erst wenn eine Funktion gar nicht mehr ( - oder zumindest nicht mehr mit den gleichen Parametern) ansprechbar wird, zeigt der Wrapper auf eine Falsche Position und schießt die Daten in's Nirvana... - besten falls...
Doch da ich noch keine Zeit gefunden habe damit herumzuspielen weiß ich es eben überhaupt nicht und bin noch weit vom Verstehen entfehrnt...

Auf die Lösung mit dem Pionter Operator wäre ich natürlich überhaupt nicht gekommen. Es war also einfach nur das kleine Sternchen vor der Funktion, die nun diese Sache zum laufen bringt.
Das ist für mich noch sehr der Gewöhnung bedürftig.
Und ich bin ja mal gespannt, wann ich endlich in der Lage bin das eigenständig umzusetzen.
Schließlich will ich ja auch eines Tages einen produktiven Beitrag bringen - und nicht nur immer der sein, der auf eure (sowohl pfiffigen als auch genialen) Antworten angewiesen ist... zwinkern
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
volta



Anmeldungsdatum: 04.05.2005
Beiträge: 1876
Wohnort: D59192

BeitragVerfasst am: 07.08.2008, 13:01    Titel: Antworten mit Zitat

Wrapper

MFreeImage.bas ist praktisch die "FreeImage.bi-Datei" für VB, wird in der FreeImage3xxxWin32.zip mitgeliefert.

Von VB wird nur das Laden von DLLs während der Laufzeit unterstützt. (Dynamic_Link_Library)
Externe DLL-Funktionen werden deklariert, im Hintergrund wird die DLL geladen (LoadLibrary) und die Funktionsadresse ermittelt (GetProcAddress).
Das entspricht in FB der Methode mit DYLIBLOAD .. DYLIBSYMBOL .

Eine andere Methode ist die Funktionsadresse aus der DLL statisch schon beim compilieren des Programms einzufügen.
Das hat seine Vor- und Nachteile:
Vorteil: zur Laufzeit muss nicht jede Funktionsadresse zeitaufwändig ermittelt werden.
Nachteil: die Funktionsadressen gelten nur für die DLL-Version aus der sie ermittelt wurden (mit dlltool.exe).
FB verwaltet diese statischen Funktionsadressen in einer libxxx.dll.a Lib-Datei die in einer Deklarations-Datei (xxx.bi) dann mit #Inclib "xxx" eingebunden wird.
_________________
Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Mae



Anmeldungsdatum: 04.06.2008
Beiträge: 26

BeitragVerfasst am: 07.08.2008, 13:51    Titel: Antworten mit Zitat

peinlich ...merk gerade ich hab mir gestern Abend keine Mühe gegeben, vielleicht hätte ich wenigstens Gedult zeigen können und alles lieber heut' morgen mit wachen Augen ansehen sollen.
Vielen Dank umsomehr das Du Dir beim erklären größte Mühe gibtst und mir sogar die Links und Quellen hier einbaust.

Da es allerdings so schön bequem geworden ist - weißt Du zufällig...
Nein! Nur Spaß! Ich hab mir die Artikel schon durch gelesen.
Aber wenn ich es richtig verstehe:

volta hat Folgendes geschrieben:
zur Laufzeit muss nicht jede Funktionsadresse zeitaufwändig ermittelt werden.

Geschieht dies nicht bei jedem Funktionsaufruf, sondern bereits beim Dynamischen nachladen - oder?
Sollten es also wirklich mehrer DLLs sein, könnte man das doch prima via Splash-Screen überbrücken...
Von daher würde ich jetzt in Zukunft die Dynamische Variation auf jeden fall vorziehen: Man will ja schließlich den Leuten nicht Ihre System-Umgebung vorschreiben... zwinkern

Oder hab ich da wieder etwas verpennt?
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
28398



Anmeldungsdatum: 25.04.2008
Beiträge: 1917

BeitragVerfasst am: 07.08.2008, 14:42    Titel: Antworten mit Zitat

Du lieferst einfach die FreeImage Version mit die dein Programm braucht...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Allgemeine Fragen zu FreeBASIC. Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

 Impressum :: Datenschutz