Das Notes Forum

Domino 9 und frühere Versionen => ND6: Entwicklung => Thema gestartet von: Andreas Huhn am 27.09.05 - 08:09:13

Titel: Dateigröße abfragen (RTF)
Beitrag von: Andreas Huhn am 27.09.05 - 08:09:13
Hallo,

in ein RichText-Feld soll eine Datei per Drag&Drop gezogen werden. Ab einer bestimmten Dateigröße soll eine Warnung ausgegeben werden. Wie kann ich die Größe der gedroppten Datei abfragen?

Viele Grüße,

Andreas
Titel: Re: Dateigröße abfragen (RTF)
Beitrag von: eknori am 27.09.05 - 08:12:53
RTFM zu @AttachmentLengths( excludeMIMEBody )
Titel: Re: Dateigröße abfragen (RTF)
Beitrag von: Axel am 27.09.05 - 08:15:47
Hi,

schau dir mal in der Designer-Hilfe die Eigenschaft FileSize aus der Klasse NotesEmbeddedObject an.

Beispiel aus der Hilfe:

Dim doc As NotesDocument
Dim rtitem As Variant
Dim object As NotesEmbeddedObject
Dim sizeInBytes As Long
'...set value of doc...
Set rtitem = doc.GetFirstItem( "Body" )
If ( rtitem.Type = RICHTEXT ) Then
  Set object = rtitem.GetEmbeddedObject( "City picture" )
  sizeInBytes = object.FileSize
End If


Axel
Titel: Re: Dateigröße abfragen (RTF)
Beitrag von: klaussal am 27.09.05 - 08:17:29
Ich denke mal, das geht so alles nicht, wenn er die Grösse VORHER wissen will. Kenne da aber auch keine Lösung  :'(
Titel: Re: Dateigröße abfragen (RTF)
Beitrag von: Andreas Huhn am 27.09.05 - 08:21:40
Guten Morgen ihr beiden,

also es sind evtl. auch mehrere RTs vorhanden in die gedroppt werden soll. @AttachmentLengths liefert aber ja immer die gesamte Liste, wenn ich die Hilfe richtig verstanden hab.

Die Eigenschaft FileSize sieht sehr interessant aus. Aber welchem Ereignis soll ich diesen Code zuweisen? Dem RT OnChange?

Den Code versteh ich leider nicht ganz. Da das doch eine Funktion ist die unabhängig von der Datenbank wahrscheinlich öfter benötigt wird... habt ihr da vielleicht eine fertige Funktion?
Titel: Re: Dateigröße abfragen (RTF)
Beitrag von: umi am 27.09.05 - 08:33:29
Morgen,

Du willst also vor dem Attachen die Grösse der Datei wissen? Dann öffne die Datei zuerst als Stream (s.h. Hilfe) anschliessend kannst Du mit  dem Property "Bytes" auf die Anzahl Bytes, sprich die Dateigrösse zugreifen.

Titel: Re: Dateigröße abfragen (RTF)
Beitrag von: Axel am 27.09.05 - 08:41:31
Hi,

RTF-Felder haben die "manchmal unangenehme" Eigenschaft, dass das Dokument erstmal gespeichert, geschlossen und wieder geöffnet werden muss, damit man sauber mit Script darauf zugreifen kann.

Der OnChange-Event wird nicht immer zuverlässig ausgeführt. Ich würde es mal in QuerySave-Event der Maske versuchen.

Was verstehst du am Code nicht. In der Hilfe ist doch alles gut beschrieben.

... habt ihr da vielleicht eine fertige Funktion?

Was bringt dir eine fertige Funktion, wenn dir die Funktionsweise unklar ist? die Funktion setzt du dann ein und hoffst das sie funktioniert. Wenn nicht, oder wenn Anpassungen gemacht werden müssen, stehst du wieder da und weißt nicht was du machen musst.

Sei mir nicht böse, aber ich habe es schon oft erlebt, dass es heisst: ich habe mit den Code aus dem Internet gezogen und in meine DB übernommen und nun geht nix. Das bringt nix. Du musst verstehen was du machst.

Bei Problemen helfen wir gerne, aber erwarte von uns keine fertigen Problemlösungen.

Axel
  
Titel: Re: Dateigröße abfragen (RTF)
Beitrag von: Axel am 27.09.05 - 08:57:03
Ich würde es mal in QuerySave-Event der Maske versuchen.

Ich habe mal ein bisschen probiert. Im QuerySave funktionierts nicht sauber. Bei einem neuen Dokument kann man nicht auf das RTF-Feld zugreifen (weil RTF-Feld erst nach dem Speichern "wirklich ansprechbar" ist). Nach dem ersten Speichern geht's. Im PostSave-Event funktioniert das Ganze. Wenn du nur eine Warnung ausgeben willst, reicht es.


Axel


Titel: Re: Dateigröße abfragen (RTF)
Beitrag von: Andreas Huhn am 27.09.05 - 13:38:13
Okay...

ich habs jetzt so:

Code
Sub Postsave(Source As Notesuidocument)
	Dim doc As NotesDocument
	Dim rtitem As Variant
	Dim object As NotesEmbeddedObject
	Dim sizeInBytes As Long
	
'...set value of doc...
	Set doc = source.Document
	
	
	Set rtitem = doc.GetFirstItem( "A1" )
	If ( rtitem.Type = RICHTEXT ) Then
		Set object = rtitem.GetEmbeddedObject( "City picture" )
		sizeInBytes = object.FileSize
	End If
	
End Sub


Also ich versteh das so:

Zuerst muß ich der Objektvariable doc einen Verweis auf das aktuelle Dokument geben. Das wird der Funktion über den Parameter "Source" gleich mitgegeben.

Dann suche und befülle ich die Objektvariable "rtitem" mit dem Feld namens "A1"

Jetzt überprüfe ich nocheinmal ob es sich bei dem gefundenen Objekt auch wirklich um ein RichText-Feld handelt.

Wenn ja dann weise ich der Objektvariable "object" den Inhalt des Feldes "rtitem" zu, wobei dieser Inhalt den Dateinamen "City picture" hat (???)

Als letzten Schritt lese ich aus wieviele Bytes "object" nun hat.


Hab ich das so richtige verstanden / gemacht?

Wenn ja hab ich folgendes Problem: Den Namen des EmbeddedObject ("City picture") kenne ich ja nicht vorher.

Hoffe ihr seht auch daß ich mir wirklich Mühe gebe es zu verstehen..

MfG
Titel: Re: Dateigröße abfragen (RTF)
Beitrag von: Axel am 27.09.05 - 13:51:13
Hab ich das so richtige verstanden / gemacht?

Du hast das richtig verstanden.

Das Ermitteln des/der Namen(s) der Anhänge ist auch kein großen Problem.

If rtitem.Type = RICHTEXT Then
   Forall objects In rtitem.EmbeddedObjects
      If objects.Type = EMBED_ATTACHMENT Then
         Messagebox objects.Name & ": " & Str(objects.FileSize)
      End If  'If objects.Type = EMBED_ATTACHMENT
   End Forall  'Forall objects In rtitem.EmbeddedObjects

End If  'If rtitem.Type = RICHTEXT 

Du muss deinen Code so erweitern. Mit einer Forall-Schleife durchläufst du alle Objekte im RTF-Feld. Handelt es sich dabei um einen Dateianhang wird der Name und die Größe angezeigt.


Axel
Titel: Re: Dateigröße abfragen (RTF)
Beitrag von: koehlerbv am 27.09.05 - 14:08:29
Moment - es geht doch hier um Drag & Drop und nicht um Attachments !

Bernhard
Titel: Re: Dateigröße abfragen (RTF)
Beitrag von: Axel am 27.09.05 - 14:15:41
Es geht darum die Größe eines Attachments abzufragen. Das Attachment wird über Drag & Drop angehängt, das ist schon richtig. Aber hast du eine Chance die Größe schon während des Ablegens abzufragen. Ich denke nein, oder hast du eine Lösung.

Meines Erachtens geht es nur in den Maskenevents nach dem Speichern.


Axel
Titel: Re: Dateigröße abfragen (RTF)
Beitrag von: Andreas Huhn am 27.09.05 - 14:19:41
Vielen Dank Axel, so klappt es!

Eine Frage noch, was ist der Unterschied zwischen
EMBED_ATTACHMENT
und
EMBED_OBJECT

beide tauchen in der Hilfe zu "EmbedObject method"  auf, ohne daß auf den Unterschied näher eingegangen wird. Wann würde ich EMBED_OBJECT hernehmen?

Daß es nicht direkt bei Drag&Drop (ein herzliches Danke an umi, aber das mit den Streams bekomm ich allein nie hin) geht ist schade, aber das ist schon mal eine Lösung die ihren Zweck erfüllt.

Titel: Re: Dateigröße abfragen (RTF)
Beitrag von: koehlerbv am 27.09.05 - 14:20:38
Aber hast du eine Chance die Größe schon während des Ablegens abzufragen. Ich denke nein, oder hast du eine Lösung.

Für den Prozess des Ablegens gibt es leider kein Event. Ich sehe dass genauso wie Du, Axel: Erst nach dem Speichern kann man da was machen.

Allerdings: Wenn ich Drag'n Drop mache (aus dem Explorer), dann bekomme ich ein eingebettetes Objekt und kein Attachment.

Bernhard
Titel: Re: Dateigröße abfragen (RTF)
Beitrag von: Axel am 27.09.05 - 15:06:59
Allerdings: Wenn ich Drag'n Drop mache (aus dem Explorer), dann bekomme ich ein eingebettetes Objekt und kein Attachment.

Ich habe das mal probiert und kann das nicht nachvollziehen. Bei mir ist das ein Attachment. Die Abfrage
If objects.Type = EMBED_ATTACHMENT Then ist wahr.

Was ist denn bei dir anders?


Axel

Titel: Re: Dateigröße abfragen (RTF)
Beitrag von: koehlerbv am 27.09.05 - 15:11:09
Keine Ahnung. Ich habe ein normales RTF in einem Dokument, welches in einem Fenster zum Bearbeiten geöffnet ist. In einem anderen Fenster lungert der Explorer herum. Aus diesem ziehe ich nun ein PDF-File und lasse es ins RTF im anderen Fenster fallen ... und habe ein eingebettetes PDF-Objekt (was dann zu $Files und $OLEOBJINFO im Doc führt.

Bernhard
Titel: Re: Dateigröße abfragen (RTF)
Beitrag von: Axel am 27.09.05 - 15:29:35
Ich hab's auch noch mal mit einem PDF probiert. Bei mir gibt's blos ein $Files und die Abfrage nach EMBED_ATTACHMENT ergibt wahr. Ist auch nur ein normales RTF-Feld in einem einfachen Dokument. Eine spezielle Einstellung, die so was regelt habe ich auch nicht gefunden.

Seltsam.   :-:

Aber was soll's, getreu dem Motto meines früheren Ausbilders:

Zitat
Alles was ihr nicht versteht müsst ihr als gegeben hinnehmen.


Axel
Titel: Re: Dateigröße abfragen (RTF)
Beitrag von: koehlerbv am 27.09.05 - 15:55:40
Jo, das müssen wir wohl als gegeben hinnehmen ... Ich erinnere mich noch daran, dass ich Ende der 90er in eine Applikation eine Grössenprüfung für eingefügte Bilder extra deswegen noch erweitern musste, weil es immer wieder Spezies fertig brachten, per Drag&Drop Objekte (!) in dem RTF für Bilder zu erzeugen (die dann natürlich sichtbar waren und auf den ersten Blick wie importierte Images aussahen).

Ich hab' jetzt extra nochmal nachgeschaut:
Code
		If docCurrent.HasItem ("$OLEOBJINFO") Then
			Set itemToRemove = docCurrent.GetFirstItem ("$OLEOBJINFO")
			While Not (itemToRemove Is Nothing)
				Call itemToRemove.Remove
				Set itemToRemove = docCurrent.GetFirstItem ("$OLEOBJINFO")
			Wend
		End If	

Wäre interessant zu wissen, welche Einstellung zu Anhängen und welche zu OLE Objekten führt ...

Bernhard
Titel: Re: Dateigröße abfragen (RTF)
Beitrag von: Andreas Huhn am 28.09.05 - 10:54:17
Hallo,

ich nochmal mit 2 kleinen Problemen.


[1] Wenn im RT mal keine Datei ist und das Dokument gespeichert wird (kommt ja auch mal vor) dann kommt die Fehlermeldung "Type Missmatch"

[2] Ich hab versucht eine Größenabfrage einzubauen, damit die Warnung nur angezeigt wird wenn die Datei mehr als 3MB groß ist. Aber das funktioniert nicht, die "Then"-Bedingung wird nicht mehr durchlaufen.

Der Code:

Code
Sub Postsave(Source As Notesuidocument)
	Dim doc As NotesDocument
	Dim rtitem As Variant
	Dim object As NotesEmbeddedObject
	Dim sizeInBytes As Long
	
'...set value of doc...
	Set doc = source.Document
	
	
	Set rtitem = doc.GetFirstItem( "A1" )
	
	If rtitem.Type = RICHTEXT Then
		Forall objects In rtitem.EmbeddedObjects
			Messagebox objects.FileSize
			If objects.Type = EMBED_ATTACHMENT And objects.FileSize > 3145728 Then ' 3MB Grenze
				Messagebox "Achtung: Die Datei " & objects.Name & " ist " & Trim(Str(Round(objects.FileSize / 1048576 ,2))) & _
				"MB groß!" &  _
				|
(Falls möglich sollte eine Konvertierung in ein speicherschonenderes Format erwogen werden. Z.B. BMP -> JPEG)|, 0+64,"Hinweis"
			End If 
		End Forall
	End If
	
End Sub

Könnt ihr mir sagen wo meine Fehler liegen?

Andreas
Titel: Re: Dateigröße abfragen (RTF)
Beitrag von: Axel am 28.09.05 - 12:05:20
Hi,

zu [1]

du kannst mit doc.HasEmbedded abfragen, ob es im Dokument eingebettete Objekte oder Dateianhänge gibt.

If doc.HasEmbedded Then
   If rtitem.Type = RICHTEXT Then
                ...

End If
....


zu [2]

Wie hat denn deine If-Abfrage ausgesehen?


Axel


Titel: Re: Dateigröße abfragen (RTF)
Beitrag von: Andreas Huhn am 28.09.05 - 12:43:44
Hab das in die Abfrage nach dem Type mit eingebaut:

Code
If objects.Type = EMBED_ATTACHMENT And objects.FileSize > 3145728 Then

.. getestet mit einem 13MB PDF.
Titel: Re: Dateigröße abfragen (RTF)
Beitrag von: Andreas Huhn am 28.09.05 - 12:54:26
Im Dokument sind noch mehr RichText-Felder. Wenn eines der anderen gefüllt ist dann kommt die gleiche Meldung wieder.

Mit rtitem.HasEmbedded klappt es nicht. Kann ich die Fehlermeldung noch auf andere Weise unterdrücken?
Titel: Re: Dateigröße abfragen (RTF)
Beitrag von: Axel am 28.09.05 - 13:13:03
Mit rtitem.HasEmbedded klappt es nicht.

Kann es auch nicht, denn HasEmbedded ist eine Eigenschaft der Klasse NotesDocument und nicht der Klasse NotesRichtextItem.

Du musst das mit doc.HasEmbedded abfragen. So wie ich es geschrieben hatte.


Hab das in die Abfrage nach dem Type mit eingebaut:

Code
If objects.Type = EMBED_ATTACHMENT And objects.FileSize > 3145728 Then

.. getestet mit einem 13MB PDF.

Versuch's mal so:

If objects.Type = EMBED_ATTACHMENT
  If objects.FileSize > 3145728 Then ' 3MB Grenze
    Messagebox "Achtung: Die Datei " & objects.Name & " ist " & Trim(Str(Round(objects.FileSize / 1048576 ,2))) & "MB groß!" & |(Falls möglich sollte eine Konvertierung in ein speicherschonenderes Format erwogen werden. Z.B. BMP -> JPEG)|, 0+64,"Hinweis"
  End If
End If


Axel
Titel: Re: Dateigröße abfragen (RTF)
Beitrag von: Andreas Huhn am 28.09.05 - 13:34:16
Ok, die Abfrage nach der Größe klappt jetzt in einer extra If-Bedingung.

Aber der "Type Missmatch" bleibt.

Ich habe es mit "If doc.HasEmbedded" gemacht, aber wie gesagt. Wenn in einem der anderen RTs des Dokuments eine Datei liegt dann wird die Fehlermeldung ausgeworfen. (Ich vermute, weil die Abfrage dann ja 'TRUE' ergibt und im RT "A1" aber trotzdem kein Attachment vorhanden ist)



If doc.HasEmbedded Then
      If rtitem.Type = RICHTEXT Then
         Forall objects In rtitem.EmbeddedObjects
            If objects.Type = EMBED_ATTACHMENT Then
               If objects.FileSize > 3145728 Then
Titel: Re: Dateigröße abfragen (RTF)
Beitrag von: Axel am 28.09.05 - 13:44:14
Ich vermute, weil die Abfrage dann ja 'TRUE' ergibt und im RT "A1" aber trotzdem kein Attachment vorhanden ist

Du vermutest richtig. Ein Hinweis, dass es mehrere RTF-Felder mit Dateien geben kann wäre hilfreich gewesen.


So sollte es aber jetzt klappen:


If doc.HasEmbedded Then
  If rtitem.Type = RICHTEXT Then
    If Not Isempty(rtitem.EmbeddedObjects) Then
      Forall objects In rtitem.EmbeddedObjects
        If objects.Type = EMBED_ATTACHMENT Then
          If objects.FileSize > 3145728 Then


Axel
Titel: Re: Dateigröße abfragen (RTF)
Beitrag von: Andreas Huhn am 28.09.05 - 13:49:18
Vielen Dank Axel! Jetzt klappt es wirklich.

Im zweiten Post auf der Seite habe ich es erwähnt gehabt daß es mehrere RTs gibt. Hätte das vielleicht etwas mehr betonen sollen, sorry.

Viele Grüße,

Andreas
Titel: Re: Dateigröße abfragen (RTF)
Beitrag von: Axel am 28.09.05 - 13:59:37
Im zweiten Post auf der Seite habe ich es erwähnt gehabt daß es mehrere RTs gibt.

Stimmt.  :o  Ich hab's wahrscheinlich gelesen, aber anscheinend mit zunehmender der Dauer des Thread nicht mehr bedacht zu haben.

Freut mich das es jetzt funktioniert.

Axel