Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!

Mobiles Hauptmenü

OT / Verteilung von Komponenten

Begonnen von Hondo, Oktober 13, 2016, 12:32:03

⏪ vorheriges - nächstes ⏩

Hondo

--- Thema abgetrennt von http://www.access-o-mania.de/forum/index.php?topic=21800 ---

Hallo,
nein, die Bilder die im Formular eingebettet sind gehen beim Import nicht verloren, sonst wäre das ganze ja sinnfrei.
Separat als Anlage speichern - weil diese dann im Endlosformular als Datenherkunft von Bildsteuerelementen diesen.
Es gibt imo 2 Möglichkeiten Bilder im Endlosformular korrekt anzuzeigen:
- als Datenherkunft aus Anlagefeldern
- als Ole-Objekt im gebundenen Objektfeld
Die 2. Möglichkeit kommt nicht inbetracht, weil beim Laden der Icons das Formular stark flackert - bzw. der Aufbau des Formular von oben nach unten zu langsam vor sich geht.

Das Anlegen einer Tabelle mit Anlagefeld per VBA ist nicht ganz einfach, geht imo auch nur über eine TableDef:

    Dim strSQL As String
    Dim db As DAO.Database
    Dim td As DAO.TableDef
    Dim fd As DAO.Field
    Dim rsParent As DAO.Recordset2
    Dim rsChild As DAO.Recordset2

    Set db = CurrentDb

    'Create Table ztblIcons
    strSQL = "Create Table ztblIcons (" & _
             "[ID] AUTOINCREMENT PRIMARY KEY, " & _
             "[IconName] TEXT(50), " & _
             "[IconNumber] INTEGER)"
    db.Execute strSQL

    'Append Attachment field to table
    Set td = db.TableDefs("ztblIcons")
    Set fd = td.CreateField(Name:="Icon", Type:=dbAttachment)
    td.Fields.Append fd
    db.TableDefs.Refresh


Gruß Andreas

MaggieMay

Du benutzt also Formulare mit eingebetteten Bildern als "Container" für den Transport derselben aus einer Anwendung in eine andere? Warum dieser Weg, warum nicht ganz normal über das Dateisystem?  ???
Freundliche Grüße
MaggieMay

Hondo

Es ist genau 1 Formular, welches als TreeView eingefügt werden kann.
Wenn man eine Komponente weitergibt oder in anderen DBs verwendet, ist es dann nicht einfacher 1 Komponente im Projektverzeichnis zu speichern anstatt zig Komponenten, die womöglich noch in einer Verzeichnisstruktur vorliegt?
Außerdem müsste dann der Anwender alle Icons in eine Tabelle einfügen.

Warum sollte der Anwender das machen wenn er nur ein simples TreeView einsetzen möchte?
Andreas

Josef P.

#3
Hallo!

@Andreas:
Welchen Vorteil siehst du bei einer zusätzlichen Tabelle mit einem Anlagefeld für die Icons im Vergleich zur Speicherung in MSysResources?


@Andreas als Forum-Admin: Wenn du willst, kannst du den folgenden OT-Teil auch in einen neuen Thread absplitten, falls du das weiter diskutieren willst, da ich mich jetzt weit vom Thema "Gebundene Bilder" weg bewege. ;)
[OT / Einfügen von Komponenten]

Ich verstehe irgendwie die "Angst" vor dem Einfügen von mehreren zusammenarbeitenden Komponenten nicht. Der Drang alles in einer einzigen Klasse (oder Formular) unterzubringen, kann meiner Meinung nach auch nach hinten los gehen, da man damit möglicherweise unflexible Elemente erzeugt.

Natürlich wäre das Einfügen umständlich, wenn man jede benötigte Komponenten kennen, einzeln auswählen und einfügen muss. Aus diesem Grund erstellte ich beispielsweise für die CodeLib einen Import-Assistenten, der diese Aufgabe übernimmt.
Zum Einfügen so eines TreeView-Formulars könntest du ein Access-Add-In erstellen und schon kannst du mit wenigen Mausklicks alle benötigten Komponenten in die jeweilige Anwendung einfügen. Die letzte Variante wählte ich für den ACLib-FilterForm-Wizard mit dem ich einerseits die benötigen Klassen in die Anwendung einfüge aber auch im ausgewählten Formular Code einfügen, damit der Nutzer dieser Klassenstruktur die Steueranweisungen nicht selbst schreiben bzw. von irgendwoher per Copy&Paste einfügen muss.

Das Beispiel vom FilterForm-Wizard auf einen TreeviewForm-Wizard umgedacht, führt mich zu folgender Vorgehensweise, wie ich mir die Arbeit mit dem Assistenten vorstellen könnte:

  • Ich öffnen das Formular, in das ich ein Treeview einfügen will in der Entwurfsansicht
  • Ich starte das Access-Add-In
  • Im Access-Add-In wähle ich das Formular aus bzw. es wird das aktuelle Formular vorgeschlagen
  • Anschließend wähle einige Layout-Optionen, wie ich das Treeview verwenden will (Beispielswiese einen Icon-Satz, die gewünschte Schrift, usw.
  • Dann stelle ich ein, wie ich das Treeview laden will (über eine Schleife die einzelnen Zweige einlesen oder eine Daenquelle übergeben o. ä.)
  • ...
  • Zum Schluss klicke ich auf "Einfügen" und das Add-In fügt mit die benötigten Komponenten inkl. Icons usw. in die Anwendung und den Basis-Code in das Formular ein

mfg
Josef

MaggieMay

Hallo Andreas,
ZitatEs ist genau 1 Formular, welches als TreeView eingefügt werden kann.
warum willst du dann die Bilder aus dem Formular "exportieren"? Sie stehen doch für alle möglichen Aktionen innerhalb des Formulars zur Verfügung.

ZitatWenn man eine Komponente weitergibt oder in anderen DBs verwendet, ist es dann nicht einfacher 1 Komponente im Projektverzeichnis zu speichern anstatt zig Komponenten, die womöglich noch in einer Verzeichnisstruktur vorliegt?
Ich verstehe überhaupt nicht, woran du dabei denkst. Wie kommst du von einer Komponente plötzlich auf zig Komponenten?

ZitatAußerdem müsste dann der Anwender alle Icons in eine Tabelle einfügen.
Warum denn das, sie befinden sich doch im Formular?!  ???

Ich fürchte, ich kann zu deinem Thema nichts Sinnvolles mehr beitragen und sollte mich besser hier ausklinken, weil ich dein Problem bzw. deine Fragestellung (oder Aufgabe) nicht wirklich verstehe. Das aber wiederum fuchst mich schon, denn ich würde nur zu gerne verstehen was du da eigentlich im Sinn hast. Gibst du mir noch eine Chance? ;-)

PS:
Deine Bemerkung
ZitatJosef weiss um was es dabei geht
lässt darauf schließen, dass Josef mehr über dein Projekt weiß als wir. Welchen Sinn macht es aber, uns Informationen vorzuenthalten, die für das Verständnis nicht unentbehrlich sind? Dann musst du dich nicht wundern, wenn es hier nicht wirklich voran geht und könntest das Thema auch ebensogut mit Josef allein ausdiskutieren.
Freundliche Grüße
MaggieMay

markusxy

Zitat von: MaggieMay am Oktober 14, 2016, 01:15:23
Welchen Sinn macht es aber, uns Informationen vorzuenthalten, die für das Verständnis nicht unentbehrlich sind? Dann musst du dich nicht wundern, wenn es hier nicht wirklich voran geht und könntest das Thema auch ebensogut mit Josef allein ausdiskutieren.

Andreas,
versuch einmal den Thread aus der Sicht jemandes zu lesen, der mit deinem Thema nicht vertraut ist.
Möglicherweise wirst du künftig etwas so beschreiben, dass man nicht 20mal nachfragen muss, und sich dann immer noch nicht sicher ist.

Aber ich weiß selbst, wie schwer es manchmal ist einen Sachverhalt unmissverständlich darzustellen. Da muss man sich halt Zeit nehmen. Meistens finde ich die Antwort bereits beim Versuch die Frage klar zu formulieren, und mal ehrlich, dass ganze Thema hat jetzt - für jemanden von deinem Format - nicht den besonderen Anspruch. Das hättest du in kürzester Zeit mit einfachen Tests feststellen können.

LG Markus

Hondo

Josef, wenn man ein AddIn zur Verteilung nutzen kann wie das deine ist die Verteilung von mehreren Komponenten natürlich kein Problem mehr.
Ich benötige ja sowieso eine Tabelle für die Datenbindung, warum sollte ich dann dort nicht die Icons  speichern?
Wenn ich die Icons in der MSysResources speichern würde müsste ich den Bildnamen (ohne Suffix) kennen und diesen in der TreeView-Tabelle speichern.
Ich speichere lieber eine Nummer und hole mir in die Abfrage den Bildnamen aus der Icontabelle.
Außerdem halte ich es für unsicher wenn ein Anwender im Ribbon in der Bildergalerie einfach so per Rechtsklick Bilder löschen kann die er für unnötig empfindet, und diese dann auch in MSysResources gelöscht sind.

@MaggieMay
Nein, eben nicht. Es ist ein Endlosformular! Schon zig mal gesagt.
Nenne die Komponenten doch einfach Dateien! 1 Accdb mit dem Formular und 99 Bilddateien sind schon mal 100 Dateien/Komponenten.

Nochmal es geht darum mit Access-Bordmitteln ein Treeview zu simulieren das auch wie eines Aussieht und Funktioniert.
Das geht nur im Endlosformular. Also müssen alle Icons die darin angezeigt werden sollen in einer Tabelle/Abfrage an das Endlosformular gebunden werden sonst sieht mal alle Icons in jedem Datensatz.

Es gab auf der AEK 2016 einen Vortrag zu diesem Thema wo man etwas Einblick in den Aufbau hatte. Da auch Josef in Nürnberg zugegen war kennt er das Thema.

@Markus,
es ist nun mal ein schwieriges Thema. Nachfragen ist ja kein Problem.
Aber es ist doch klar was eingebettete Bilder sind - oder? Diese werden vom System in MSysResources gespeichert.
Wenn man aber ein Formular mit eingebetteten Bildern in eine andere Datenbank importiert sind zwar die eingebetteten Bilder noch da, aber die Einträge in MSysResources nicht mehr.

Ich mach heute mal eine Version fertig und stelle diese hier als Download ein.
Andreas

Josef P.

#7
ZitatAußerdem halte ich es für unsicher wenn ein Anwender im Ribbon in der Bildergalerie einfach so per Rechtsklick Bilder löschen kann die er für unnötig empfindet, und diese dann auch in MSysResources gelöscht sind.
Meine Meinung dazu:
Der Anwender ist in diesem Fall der Entwickler, der die Icons festlegt, die er im Treeview haben will. Das Treeview-Formular als Import-Komponente kann durchaus ein paar Standardbilder mitbringen. Welche Bilder eingesetzt werden, hat aber der Entwickler zu entscheiden. Und wenn der dann die benötigten Bilder aus der MSysResources löscht ist das sein Problem. ;)

mfg
Josef

Hondo

Hallo,
also es ist zum Haare raufen.
Folgendes Beispiel: erstell eine Tabelle1 mit Feldern ID (Autowert), IconName(Text 50) und Standard(Anlage)
Füge manuell 1 Datensatz ein mit Anlage.
Erstelle Formular1 mit Bildsteuerelement, binde das Formular1 an Tabelle1, binde das Bildsteuerelement an das Feld Standard.
Formular öffnen, Bild wird angezeigt. DB schließen, öffnen, Form öffnen, Bild wird immer noch angezeigt.
Access schließen, Access Öffnen, DB öffnen und Formular öffnen, Bild wird nicht mehr angezeigt.

Kurze Rede langer Sinn, das taugt alles nichts.
Die Standard-Bilder wie expand, collapse, folder oder ggf. Hintergrunddateien müssen als Dateien mit ins DB-Verzeichnis, und der Entwickler muss diese über die Bildergalerie einpflegen. Alles andere ist mist.

Ich hab jetzt mal eine Beispieldatei fertig gemacht wo die Bilder bereits in der Bildergallerie eingefügt sind. 2 Hauptformulare die versch. Inhalte in das Tree laden, Hintergründe setzen etc. Alles noch rudimentär.

Datenbank ist eine AccDB!
Zur freien Verwendung.
Gruß Andreas

Josef P.

Hallo!

ZitatKurze Rede langer Sinn, das taugt alles nichts.
Die Standard-Bilder wie expand, collapse, folder oder ggf. Hintergrunddateien müssen als Dateien mit ins DB-Verzeichnis, und der Entwickler muss diese über die Bildergalerie einpflegen. Alles andere ist mist.
Da bin ich anderer Meinung.

Bildtyp "Eingebettet" ist die falsche Einstellung. ;)
Entweder Verknüpft oder Freigegeben (je nachdem woher die Bilder kommen).
Ich würde Freigegeben (Shared) verwenden, dann muss man sich in der Datenquelle nicht um das Bild kümmern. Es reicht dann aus, wenn man ein Textfeld mit dem Namen an das Bildsteuerelement bindet.

mfg
Josef

Hondo

Hallo Josef,
verstehe ich nicht ganz.
Du meinst also Tabelle mit Anlagefeld und Bildnamen (ohne Endung), Formular an Tabelle binden und Picturebox an Feld Bildnamen binden und als Bildtyp freigegeben wählen?

Aber das funktioniert nicht. zumindest nicht unter Acc2010

Oder meinst du anstatt einer Picturebox den neuen Feldtyp Anlage zu verwenden? Damit geht es.
Andreas

Hondo

Hallo,
OK, es gibt noch den Weg mittels SafeToFile/LoadFromFile Anlagenbilder aus einer ztblIcon in die MSysResources zu schreiben. Hab das mal getestet und das funktioniert jetzt (bei wenigen Bildern) ohne dass man das merkt:

Public Sub init(ByVal ctblTreeview As String)
    Dim rsParent As DAO.Recordset2
    Dim rsChild As DAO.Recordset2
    Dim rs As DAO.Recordset
   
    On Error GoTo ErrHandler

    tblTreeview = ctblTreeview

    'first start
    If IsNull(fcDLookup("ID", "MSysResources", "Name='expand'")) Then
        Set rs = CurrentDb.OpenRecordset("ztblIcons")
        Set rsParent = CurrentDb.OpenRecordset("MSysResources")
        Do While Not rs.EOF
            With rs.Fields("Icon").value
                .Fields("FileData").SaveToFile CurrentProject.Path & "\" & rs.Fields("IconName") & "." & rs.Fields("Suffix")
LoopExit:
                rsParent.AddNew
                rsParent.Fields("Extension") = rs.Fields("Suffix")
                rsParent.Fields("Name") = rs.Fields("IconName")
                rsParent.Fields("Type") = "img"
                Set rsChild = rsParent.Fields("Data").value
                rsChild.AddNew
                rsChild.Fields("FileData").LoadFromFile CurrentProject.Path & "\" & rs.Fields("IconName") & "." & rs.Fields("Suffix")
                rsChild.Update
                rsParent.Update
            End With
            rs.MoveNext
        Loop
    End If

NormalExit:
    Set rsChild = Nothing
    Set rsParent = Nothing
    Set rs = Nothing
    Exit Sub
   
ErrHandler:
    If Err.Number = 3839 Then 'Bild bereits vorhanden
        Resume LoopExit
    End If
    MsgBox "Fehler in Prozedur init:" & vbCrLf & Err.Description & ", Fehler Nr. " & Err.Number
    Resume NormalExit
End Sub


Andreas

Josef P.

Hallo Andreas!

Zitat... ohne dass man das merkt
Und auch wenn man den einmaligen Import merken würde, wäre es meiner Meinung nach egal, da das Einspielen der Bilder sicher noch vom Entwickler durchgeführt wird.

Ich würde das nicht einmal im bei jedem Treeview-Initialisierung prüfen, sondern eher eine Route anbieten, die bei Wunsch die Standardbilder importiert. Bei der Tabelle ztblIcons gehst du doch auch davon aus, dass die Bilder darin enthalten sind.

Ein meiner Meinung nach komfortabler und verständlicher Import-Vorgang wäre immer noch der Import über ein Add-In. Über das Add-In könnten dann auch auf Wunsch die Standard-Icons eingefügt werden.

mfg
Josef

Hondo

Hallo Josef,
ja das ist definitiv der beste Weg. Aber wie kann ich über das AddIn Bilder in den Projektordner importieren?
Hab schon länger nicht mehr mit dem AddIn gearbeitet.

Andreas

Josef P.

Hallo Andreas!

Ich dachte bei Add-In an ein Add-In das noch zu erstellen ist.
(Als Beispiel könnte der ACLib-FilterForm-Wizard dienen.)

LG
Josef