|
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
Jojo alter Rang
Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 20.02.2007, 20:10 Titel: |
|
|
ThePuppetMaster hat Folgendes geschrieben: |
Da bin ich mit meiner MSVBVM60.dll noch recht zufrieden. |
Ganz meine Meinung _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
|
|
Nach oben |
|
|
Mao
Anmeldungsdatum: 25.09.2005 Beiträge: 4409 Wohnort: /dev/hda1
|
Verfasst am: 20.02.2007, 20:54 Titel: |
|
|
@TPM:
Das nicht, aber das ganze wurde in Units aufgeteilt. Zum Beispiel System, Windows, Classes, StdCtrls, ExtCtrls, etc. Man kann sie alle einbinden, wenn man möchte - was der Compiler für nicht-benötigt erachtet, fliegt raus. Der dcc32 optimiert generell ziemlich heftig und stellt teilweise Schleifen komplett um.
Aber um nochmal auf das "überflüssige" Zeug zurückzukommen. Ist so ähnlich, wie wenn du 'ne Funktion geschrieben hast, die kein Parent-Objekt hat und generell nicht aufgerufen wird - wird einfach wegcompiliert.
Also da ist schon nur das nötigste drinnen.
Btw, auch dort kann man so wie in FB, also direkt mittels API-Aufrufe ein Fenster erstellen etc. arbeiten. Allgemein wird das "nonVCL" genannt und ist ein ziemlich beliebtes Thema. EXEn werden dadurch nur einige KB groß. Ist natürlich aber auch dementsprechend aufwändiger. _________________ Eine handvoll Glück reicht nie für zwei.
--
|
|
Nach oben |
|
|
ThePuppetMaster
Anmeldungsdatum: 18.02.2007 Beiträge: 1837 Wohnort: [JN58JR]
|
|
Nach oben |
|
|
c.m.obrecht
Anmeldungsdatum: 09.03.2006 Beiträge: 377 Wohnort: Hofstetten SO, CH
|
Verfasst am: 20.02.2007, 23:10 Titel: |
|
|
Vielen Dank für das Beispiel! Kann noch nicht ganz nachvollziehen was es tut; werden die Zeilen in einzelne Variablen eingelesen?
Werde es bald ausprobieren.
Wegen .NET; es braucht wirklich auch auf einem praktisch neuen Computer seine Zeit bis nur ein kleines Programm gestartet wird (und auf einem 500 MHz dauerte die Installation schon einmal 1 Stunde) und dazu - obwohl oft davon die Rede ist - kommt mir das Ganze irgendwie unprofessionell, wie selbstgemacht halt, vor wenn man so auffällig eine riesige Laufzeitumgebung installieren muss. VB .NET habe ich schon länger, das ist ja kostenlos, doch aus diesen Gründen bin ich auf VB5 umgestiegen. Der Browser ist ein Stückchen weiter und tut seinen Dienst von allen installierten nachwievor am schnellsten, was (ist für einen Laden, Lieferantenseite, teils während dem Verkauf etwas nachschauen) für diesen Zweck auch der Sinn meines Browsers ist.
Mit dem ListBox bin ich gar nicht schlauer geworden; ausser die Methode zum hinzufügen Wie wende ich das Beispiel an? _________________ ...längre blomstre gamle nord... |
|
Nach oben |
|
|
c.m.obrecht
Anmeldungsdatum: 09.03.2006 Beiträge: 377 Wohnort: Hofstetten SO, CH
|
Verfasst am: 22.02.2007, 22:20 Titel: |
|
|
Hilfe! Habe nun eine Favoriten-Funktion eingebaut, die soweit funktioniert (einfach keine Namen zu den Adressen hinzufügen kann). Nun habe ich ein Problem; ich habe zum Erstellen einen Assistenten genommen, welcher ein Form mit Menu usw. produzierte. Als ich die Favoriten-Funktion provisorisch baute ausserhalb des Projektes (in einem neuen, kleinen mti einem WebBrowser) funktionierte es. Doch was ich auch für die Startseitenspeicherung bemerkte - die LocationURL lässt sich beim richtigen Projekt auf kein anderes Form übertragen! Somit kann die Adresse auch nicht direkt übernommen werden.
Falls jemand eine Idee hätte, ich hätte auch den Quellcode zum senden.
Hier kurze Ausschnitte der (nicht ausschliesslich) betroffenen Funktion:
Code: |
Private Sub Command1_Click()
List1.AddItem (frmMain.URL)
End Sub
Private Sub Command2_Click()
On Error GoTo err
lstindx = List1.ListIndex
List1.RemoveItem (listindx)
Exit Sub
err: Beep
End Sub
Private Sub Form_Load()
On Error GoTo err
Dim FF As Integer
FF = FreeFile
Dim Datei As String
Dim Zeichen As String
Datei = App.Path & "\lesezch.brw"
Open Datei For Input As FF
Do While Not EOF(FF)
Line Input #FF, Zeichen
List1.AddItem Zeichen
Loop
Close #FF
Exit Sub
err: MsgBox "Fehler, Lesezeichendatei konnte nicht geöffnet werden. Eventuell ist sie noch nicht vorhanden oder nicht verfügbar", vbExclamation, "Achtung"
End Sub
Private Sub Form_Unload(Cancel As Integer)
On Error GoTo err
Dim FF As Integer
FF = FreeFile
Dim Datei As String
Dim Zeichen As String
Datei = App.Path & "\lesezch.brw"
Dim I As Integer
Open Datei For Output As #FF
For I = 0 To List1.ListCount - 1
Print #FF, List1.List(I)
Next
Close #FF
Exit Sub
err: MsgBox "Fehler! Fehlernummer: " & err.Number, vbCritical, "Achtung"
End Sub
Private Sub List1_DblClick()
lstindx = List1.ListIndex
frmMain.WebBrowser1.Navigate (List1.List(lstindx))
End Sub
|
das war das Favoriten-Form
und nun im Browser (wo die Variable URL definiert wird - ein Versuch anstelle der direkten Übernahme von WebBrowser1.LocationURL):
Code: |
Private Declare Function OSWinHelp% Lib "user32" Alias "WinHelpA" (ByVal hwnd&, ByVal HelpFile$, ByVal wCommand%, dwData As Any)
Public Startadresse As String
Public URL As String
.....
....
Private Sub WebBrowser1_DocumentComplete(ByVal pDisp As Object, URL As Variant)
Text1.Text = WebBrowser1.LocationURL
URL = WebBrowser1.LocationURL
Loaded = True
sbStatusBar.Panels(1).Text = "fertig geladen"
sbStatusBar.Panels(4).Text = WebBrowser1.LocationName
|
im Panel wird der LocationName übrigens korrekt angezeigt, wie auch die URL im text1 ! _________________ ...längre blomstre gamle nord... |
|
Nach oben |
|
|
ThePuppetMaster
Anmeldungsdatum: 18.02.2007 Beiträge: 1837 Wohnort: [JN58JR]
|
Verfasst am: 22.02.2007, 23:46 Titel: |
|
|
Hä??? ... ich kann dir nicht ganz folgen.
Wo hast du denn jetzt genau das Problem?
Zur Listbox:
Diese Funktionen kannst du Direkt verwenden, die vorherigen beispiele waren eigentlich nur mal so daher geschrieben, ums mal etwas zu verdeutlichen.
Code: |
'erfordert eine Listbox mit der bezeichnung List1 auf der Form1
'erfordert einen Command mit der Bezeichnung Command1 auf der Form1
'erfordert einen Command mit der Bezeichnung Command2 auf der Form1
'erfordert einen Command mit der Bezeichnung Command3 auf der Form1
'erfordert einen Command mit der Bezeichnung Command4 auf der Form1
'Gespeichert wird das ganze auf "C:\Listx.txt"
'Diesen Code in Form1 Kopieren
Private Sub Form_Load()
'Buttons beschriften
Command1.Caption = "Liste befüllen"
Command2.Caption = "Liste speichern"
Command3.Caption = "Liste leeren"
Command4.Caption = "Liste laden"
End Sub
Private Sub Command1_Click()
'liste befüllen
Dim X As Long
For X = 1 To 20
List1.AddItem Int((Rnd * 1000) + 1)
Next
End Sub
Private Sub Command2_Click()
'liste speichern
If Dir("C:\Listx.txt") <> "" Then 'Ist die datei bereits vorhanden?
If (GetAttr("C:\Listx.txt") And vbDirectory) <> vbDirectory Then 'Ist die Datei eine Datei?
Kill "C:\Listx.txt" 'Datei löschen
End If
End If
Open "C:\Listx.txt" For Binary As #1 'Datei öffnen
Dim D As String
D = X_GetListString(List1) 'Listen-daten zusammen-sammeln
Put #1, 1, D 'Daten in Datei schreiben
Close #1 'Datei schlissen
MsgBox "Gespeichert" 'Speicherung melden
End Sub
Private Sub Command3_Click()
'liste leeren
List1.Clear
End Sub
Private Sub Command4_Click()
'Liste laden
If Dir("C:\Listx.txt") <> "" Then 'Ist die datei vorhanden?
If (GetAttr("C:\Listx.txt") And vbDirectory) <> vbDirectory Then 'Ist die datei eine Datei?
Open "C:\Listx.txt" For Binary As #1 'Datei öffnen
Dim D As String 'Speicher für Daten reservieren
D = String(LOF(1), Chr(0)) 'Variable mit ASCII 0 vor befüllen
Get #1, 1, D 'Daten von der Datei einlesen
X_SetListString List1, D 'Liste mit Daten befüllen
Close #1 'Datei schliessen
Else: MsgBox "Dateiname ist ein verzeichniss!" 'Dateiame (listx.txt) ist ein verzeichniss
End If
Else: MsgBox "Datei nicht vorhanden!" 'Die Datei ist nicht vorhanden
End If
End Sub
Public Function X_GetListString(V_List As ListBox) As String 'Funktionsaufruf. Es wird eine Liste übergeben
Dim X As Long 'Schleifen-Variable
Dim D As String 'Speicher für Die List-Daten
With V_List
For X = 0 To .ListCount - 1 'Alle Listeneinträge durchgehen
D = D & V_List.List(X) & Chr(1) 'Speicher dem x'ten Eintrag hinzufügen, und am ende ein ASCII 1 hinzufügen
Next 'Nächster Eintrag
End With
X_GetListString = D
End Function
Public Sub X_SetListString(V_List As ListBox, ByVal V_Data As String) 'Funktionsaufruf. Es werden die Daten und die Liste übergeben
Dim X As Long
Dim Pos As Long
With V_List
For X = 1 To Len(V_Data) 'Schleife durchlaufen , bis die länge der Daten erreicht wurde
Pos = InStr(1, V_Data, Chr(1)) 'Nach Position der Trenner (ASCII 1) suchen
If Pos > 0 Then 'Wurde gefunden?, dann weiter
.AddItem Left(V_Data, Pos - 1) 'Abschnitt bis zum ASCII 1 zur liste hinzufügen
V_Data = Mid(V_Data, Pos + 1) 'Rest nach dem ascii 1 abschneiden, und in Daten variable schreiben
Else: Exit For 'Nicht gefunden?, dann schleife verlassen
End If
Next
End With
End Sub |
Habe einmal alles beschriftet, sollte jetzt klar sein
Wenn du zu der URL-Liste etwas hinzufügen willst, solltest du auch eine Prüfroutine nutzen, um zu verhindern, das doppelte und dreifache Einträge darinentstehen.
Code: |
Public Sub X_AddListString(V_List As ListBox, ByVal V_Data As String) 'Funktionsaufruf. Es werden die Daten und die Liste übergeben
Dim X As Long
Dim S As String
S = LCase(V_Data) 'Hinzuzufügende Daten in kleinschrift umwandeln
With V_List
For X = 0 To .ListCount - 1 'Schleife durchlaufen , bis alle aktuellen Einträge ind er Liste durchlaufen wurden
If LCase(.List(X)) = S Then Exit Function 'Prüfen, ob ein (kleingeschriebener) Listeneintrag bereits vorhanden ist, Wenn ja, dann Funktion verlassen
Next
.AddItem V_Data 'Wenn die Funktion nicht verlassen wurde, ist der eintrag noch nicht vorhanden, also hinzufügen
End With
End Sub
|
... und .. was hast du mit dem Webbrowser udn deren URL vor? .. das ist eigentlich nciht so gedacht, was du da macht.
[Nachtrag]
Du solltest bei Dateiopperationen mehr auf Fehler eingehen. Das gilt eigentlich für all deine code-mechanismen. Jeder deiner Schritte sollte auffangbar sein, udn nicht einfach abgebrochen werden.
Ein "on error goto" ist ne feine sache, jedoch kann sie probleme verursachen.
Grundsätzlich sollte deine IDE so eingestellt sein, das sie JEDEN Fehler meldet, auch umgangene!
Dann solltest du immer am anfang deienr funktion ein "On error resume next" einbaun (die meisten sehen das anders, aber:) Das hilft unvorhersehbare fehler auf zu fangen. Wenn ein "on goto" drin is, irgend wo in einer funktion, kann das schon probleme veruhrsachen, wenn z.B. keine Variable mehr angelegt werden kann, weil kein speicher vorhanden ist. Das kann durch "resume next" umgangen werden, udn sollte deswegen am anfang jeder funktion, noch vor der variablendeclaration in einer funktion / sub eingefügt werden.
Dann, das wichtigere, sollte jeder Code-Schtitt überwacht und geschützt werden. z.B. wie ich das mit den Datein gemacht habe.
Das ist zwar Code-technisch mehr arbeit, allerdings ist es sicher, und Stabiler, als ohne. Man könnte das noch erweitern, z.B. mit der auswertung des Fehlers, durch das err-objekt. z.B. bringt ein err.number = 70 die meldung, das die Datei bereits geöffnet ist, und keien weitere sitzung mit dieser datei möglich ist.
MfG
TPM _________________ [ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ] |
|
Nach oben |
|
|
c.m.obrecht
Anmeldungsdatum: 09.03.2006 Beiträge: 377 Wohnort: Hofstetten SO, CH
|
Verfasst am: 23.02.2007, 01:37 Titel: |
|
|
Super Beispiele, vielen Dank!
Erweiterte Fehlerkorrekturen habe ich an anderen (weiter fertigen) Stellen schon eingebaut; z.B. auch die Startseitendatei, wenn man eine neue Startseite speichert wird die Datei nach dem Schreiben nochmals geöffnet, eingelesen und verglichen mit dem Eingegebenen
Zum eigentlichen Problem aber; ich habe ja mehrere Formulare; der Browser und das Form mit den Favoriten, welches sich nach Anklicken wieder schliessen sollte. Nur, wenn ich auf dem Form2 einen Button habe "Adresse übernehmen" um sie in die List zu nehmen und den Button definiere mit list1.AddItem..... Form1.WebBrowser1.LocationURL dann wird IMMER die Startseite übergeben! Das ist mein Problem (sorry, habe ich vielleicht etwas schlecht erklärt).
Lustigerweise, im Adressfeld (textbos) erfolgt eine Anzeige der Adresse nach dem Laden (DownloadComplete), genau auch mit Location URL. Und das stimmt immer. Jedoch wenn ich auch auf dem Form2 dann schreibe "form1.text1.text" und das in die Liste aufnehmen möchte kommt wieder IMMER die Startseite; auch wenn ich gleichzeitig auf dem Form sehe dass eine andere Adresse 8in dem Fall die Gewünschte) steht.
Bin ratlos, ist seltsam! Der Versuch mit public URL und dann auf dem Form1 die Adresse in die Variable URL zu speichern um diese dann auf dem Form2 zu übernehmen funktioniert ebenfalls nicht.
Die Form-Bezeichnungen stehen hier nur als Beispiel für die Erklärung, stimmen nicht direkt mit meinem Programm überein. _________________ ...längre blomstre gamle nord... |
|
Nach oben |
|
|
ThePuppetMaster
Anmeldungsdatum: 18.02.2007 Beiträge: 1837 Wohnort: [JN58JR]
|
Verfasst am: 23.02.2007, 01:59 Titel: |
|
|
hmmm .. also .. ich hab das mal probiert, und ... ich kann keinen fehler feststellen.
ist "URL" bei dir auf "frmmain" eine variable?
Code: |
Private Sub Command1_Click()
List1.AddItem (frmMain.URL)
End Sub
|
Wenn ja, dann kann das Probleme veruhrsachen, da du bereits in der übergabe von DocumentComplete diese bezeichnugn als Übergabebezeichnugn der gebrowsten URL hast.
Als Tip empfehle ich dir einmal, alle Variablen z.B. mit "X_" am anfang zu schreiben, um eventuelle übergabeprobleme zu vermeiden.
du schribst nämlich hier
Zitat: | Private Sub WebBrowser1_DocumentComplete(ByVal pDisp As Object, URL As Variant)
Text1.Text = WebBrowser1.LocationURL
URL = WebBrowser1.LocationURL
Loaded = True
sbStatusBar.Panels(1).Text = "fertig geladen"
sbStatusBar.Panels(4).Text = WebBrowser1.LocationName
|
warscheinlich den wert von LocatioURL in die bereits zurückgelieferte URL hinein. Da diese Variable eine Locale Funktions-Variable ist (ByVal übergeben), zerstört sich diese nach dem ablauf wieder.
Wenn du eine in der Form mit z.B. Private / Public /Dim declariert hast, dann bekommst du überschneidungen.
Wenn du unbedingt den namen so haben willst, dann musst du stat "URL = ..." einfach "me.URL = ..." oder "Form1.URL = ..." schreiben. Damit Localisierst du die zu beschreibende Variable auf deiner Form, und nicht die in der Funktion.
andernfalls,: Post doch mal den kompletten Quellcode oder schick ihn mir mal via PM, denn so recht sehe ich noch nicht, wo das Problem liegen soll.
MfG
TPM _________________ [ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ] |
|
Nach oben |
|
|
c.m.obrecht
Anmeldungsdatum: 09.03.2006 Beiträge: 377 Wohnort: Hofstetten SO, CH
|
Verfasst am: 23.02.2007, 13:58 Titel: |
|
|
Ja stimmt URL wird dort ja als Variant definiert. Sollte eine Variable von Form1 sein. Das habe ich gar nicht angeschaut dort Wobei, als ich dies ausliess und direkt mit webbrowser1.LoctionURL die Adresse bekommen wollte ging es auch nicht.
Als ich es in einem neuen Projekt ausprobierte funktionierte es eben auch ohne Probleme; nur im richtigen Projekt nicht.
Kann auf irgend eine Weise die Übernahme von Variablen in ein anderes Form blockiert werden? Es scheint mir fast so; kann mir aber nicht erklären wieso die Startseite übergeben wird!
Ja am besten schicke ich mal den Quellcode, soweit ich ihn habe. Hoffentlich geht er, ist immer etwas schwierig mit vb Quellcodes wieder öffnen.
Als pn kann man ja keine Dateien senden; wird etwas schwierig wegen den Forms usw.; soll cih es mailen? _________________ ...längre blomstre gamle nord... |
|
Nach oben |
|
|
ThePuppetMaster
Anmeldungsdatum: 18.02.2007 Beiträge: 1837 Wohnort: [JN58JR]
|
Verfasst am: 23.02.2007, 16:23 Titel: |
|
|
Quellcode reicht eigentlich .. ansonsten kannst es hoch laden, URL bekommst via PN _________________ [ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ] |
|
Nach oben |
|
|
c.m.obrecht
Anmeldungsdatum: 09.03.2006 Beiträge: 377 Wohnort: Hofstetten SO, CH
|
Verfasst am: 23.02.2007, 16:33 Titel: |
|
|
Hochladen wäre sicher besser, da ich den Anwendungs-Assistenten verwendet habe welcher noch COde zugefügt hat (muss ich dann am Schluss noch aufräumen, hat Ereignisse von Menüeinträgen die ich gelöscht habe usw. noch) _________________ ...längre blomstre gamle nord... |
|
Nach oben |
|
|
ThePuppetMaster
Anmeldungsdatum: 18.02.2007 Beiträge: 1837 Wohnort: [JN58JR]
|
Verfasst am: 23.02.2007, 17:30 Titel: |
|
|
Also .. ich stell dir jetzt mal alles zusammen, was ich für beanstandend halte:
Zitat: |
1.
Zitat: | Open ("StartSite.brw") For Output As #f | da solltest du immer das verzeichniss mit angeben, da es sonst zu problemen kommen kann, wenn mit CHDir oder ähnlichen Komandos "nicht" gearbeitet wird.
auch hier:
Zitat: | If FileExists("StartSite.brw") Then |
wenn du das in dem verzeichniss speichern möchtest, in dem das Programm (die exe) liegt, dann kannst du simpel
Zitat: | Open (App.Path & "\StartSite.brw") For Output As #f | schreiben
2.
is zwar nicht so wild, aber du brauchst keien "#" schreiben, bei Dateizugriff.
Zitat: | Open ("StartSite.brw") For Output As #f |
Die Raute brauchst du nur dann, wenn du einen direkten Wert ein gibst.
Zitat: | Open ("StartSite.brw") For Output As #1 |
Bei Variablen ist das nicht notwendig.
3.
Zitat: | Dim Pausenlänge, Start, Ende, Gesamtdauer |
Du devinierst diese variablen als "Variant"! ... dassolltest du nicht machen, da dieser Typ mehr speicher nutzt. Eien Direkt Devinierte Variable wäre sinnvoller.
Zitat: | Dim Pausenlänge as Long
Dim Start as long
Dim Ende as long
Dim Gesamtdauer as long |
oder je nachdem, wie gross der Wewrt wird, auf Byte, Singel oder Integer
4.
Für dein Splash-Screen gäbe es auch eine andere ALternative Variante, um dieZeit zu "berechnen", bzw. abzuwarten.
Du könntest einfach einen Timer auf die Form legen, diesen mit
Zitat: | Private sub Form_Load()
Timer1.Intervall = 60000 '(1minute = 60sek = 60000ms)
Timer1.enabled = True
End Sub
Private Sub Timer1_Timer()
me.visible = false 'dadurch wird das fenster nicht entladen!, sondern nur unsichtbar gemacht. Allerdings läuft der code nach "frmsplash.show (1)" trotzdem weiter. Es ist auch möglich "unload me" zu schreiben, stat ...visible = false
end sub
|
udn im aufruf
Zitat: |
Frmsplash.show (1) 'dadurch wartet das Programm mit dem weiteren ablauf, bis das fenster wieder geschlossen wurde, was nach dem Timer event eintritt.
|
Spart auch Code
5.
Schalte einmal bei dir in der IDE unter MENÜ -> Extras -> Optionen -> EDITOR -> "Variablendeklaration erforderlich (2te option von oben) ein.
Du wirst jetzt allerdings nachträglich noch in all deine Formulare udn Module ein "Option Explicit" GANZ OBEN, am anfang des codes einfügen müssen. Wenn du neue Projekte beginnst, dann wird das nach der einstellung dieser option jetzt automatisch hin geschrieben. Allerdigns nicht bei den bisher schon erstellten Formularen, Modulen, Klassen usw., die schon code enthalten.
Dadurch vehinderst du, das du Variblen nutzt, die nicht explizit deviniert wurde. Das kann utner umständen zu problemen kommen. (auserdem is das Profesioneller )
6.
Zitat: | List1.AddItem (frmMain.URL) |
keien () notwendig! .. Wenn du sie dennoch verwenden möchtest, dann bitte mit einem "Call" davor.
Zitat: | Call List1.AddItem(frmMain.URL) |
gillt auch für
"List1.RemoveItem (listindx)"
"WebBrowser1.Navigate (Startadresse)"
"frmBrowser.brwWebBrowser.Navigate (Text1.Text)"
usw.
() sind nur dann nötig, wenn du Werte zurück bekommst.
z.B. bei der MsgBox
Zitat: |
'Ohne Rückgabe
Msgbox "Test"
'Mit Rückgabe
Dim XBack as Long
XBack = msgbox("Test",vbYesNo)
|
7.
in frmMain hast du
Zitat: |
Public URL As String
|
Declariert. Das ist das Problem, mit dem setzen der URL, was wir vorher schon besprochen haben. Du hast einen ariablennamen doppelt. Dem Compiler is das teilweise egal, aber du hast dann dieses zugriffsproblem, auf diese Variable, die du dann nur mit "frmMain.URL = "blablub" umgeben kannst.
Du könntest den Naben abändern, z.B. mit einem "X_" davor ... "X_URL" dann kannst du aus dem selben Formular aus wieder darauf zugreifen.
8.
Zitat: | Public Function FileExists(filename As String) As Boolean 'Prüfen ob File existiert
On Error Resume Next
FileExists = Dir$(filename) <> ""
FileExists = FileExists And err = 0
On Error GoTo 0
End Function |
Das "and err = 0" ist sinnlos, da du am anfang ein "On error resume next" drinhast. Dadurch wird das err-objekt IMMER ein "0" als wert zurück geben.
alternativ kannst du
Zitat: |
Public Function FileExists(filename As String) As Boolean
On Error Resume Next
FileExists = false
If Dir(filename) <> "" then
If (getattrib(filename) and vbdirectory) = vbdirectory then
FileExists = true
endif
endif
End Function
Public Function CheckErr() As Boolean
'HIER KEIN "On error resume next"!!!!!!!
CheckErr = false
If err.Number <> 0 then
CheckErr = True
err.clear 'err-Objekt wieder leeren, damit keine probleme bei der nächsten abfrag auftauchen. (Diese nummer bleibt solange drin, bis sie mit ".clear" gelöscht wurde!!!!!!
endif
End Function
|
9.
Zitat: | Load Form2 '<<<<<<<< Brauchst du nicht, weil du in Form2. bereits ein "Unload me" eingebaut hast. Durch das "unload me" wird die form automatisch entladen. Wenn du danach "Form2.Show" auf rufst, wir automatisch wieder "private sub Form_Load()" aufgerufen.
Form2.Show '<< reicht aus
|
10.
Zitat: | URL = WebBrowser1.LocationURL |
Hier dann halt stat "URL = " das mit "X_URL = "
11.
Zitat: | If Progress > 0 And ProgressMax > 0 Then
ProgressBar1.Value = Progress * 100 / ProgressMax
End If |
hier sollte auch geprüft werden, ob "Progress" nicht das maximum überschreitet
Zitat: | If Progress > 0 And ProgressMax >= Progress Then
ProgressBar1.Value = Progress * 100 / ProgressMax
End If |
|
Das hab ich jetzt erstmal so auf die schnelle gesehen ..
Arbeite mal diese Probleme ab, dann die ganzen Fehlermeldungen, die du nach dem "Option exlplicit" bekommst, und, wenns dann noch probleme gibt, dann schreib nochmal. Dann kannst das ganze nochmal einschicken, wenn du willst. Dann können wir das ganze nochmal schritt für schritt durchgehen. Hab nämlich momentan kaum zeit, die Ganzen Variablendeklarationen nach zu hohlen.
PS: Nächstes mal reicht es, wenn du nur doe Projektdaten überträgst. Die Setup brauch ich nciht
Hf & GoodLook
MfG
TPM _________________ [ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ] |
|
Nach oben |
|
|
c.m.obrecht
Anmeldungsdatum: 09.03.2006 Beiträge: 377 Wohnort: Hofstetten SO, CH
|
Verfasst am: 23.02.2007, 19:57 Titel: |
|
|
Vielen Dank! Ich muss vielleicht erwähnen dass ich das Visual Basic erst seit ca. 2 Wochen besitze Ansonsten kenne ich das FreeBasic natürlich und habe sicher von da viel übernommen (was möglicherweise anders ist) und mit .NET habe ich schon gearbeitet, daher mache ich immer diese Klammern
Werde diverse solche Sachen optimieren.
Zum Zugriffsproblem mit der URL: leider liegt es nicht zwingend an der Variable "URL" da auch nicht die Adresse zurückgegeben wird wenn ich z.B. auf dem Form mit den Favoriten die Adresse aus der Adressleiste "frmMain.text1.text" einfügen will; im Text1 steht ja wie man sieht die richtige Adresse doch auf dem Favoriten-Form steht dann in frmMain.text1.text plötzlich die Startadresse (sofern definiert). Das ist mir so unerklärlich. _________________ ...längre blomstre gamle nord... |
|
Nach oben |
|
|
ThePuppetMaster
Anmeldungsdatum: 18.02.2007 Beiträge: 1837 Wohnort: [JN58JR]
|
Verfasst am: 23.02.2007, 20:24 Titel: |
|
|
Tja .. das hat n ganz einfachen grund
Zitat: | Set fMainForm = New frmMain |
Hoffe, du weist, was ich meine
MfG
TPM _________________ [ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ] |
|
Nach oben |
|
|
c.m.obrecht
Anmeldungsdatum: 09.03.2006 Beiträge: 377 Wohnort: Hofstetten SO, CH
|
Verfasst am: 23.02.2007, 23:09 Titel: |
|
|
Ach das! Wie kann ich das ändern? Mit diesen Objekten habe ich noch nicht sehr viel Erfahrung (und ich mag keine Objekte )
Das hat wieder der Assistent gemacht.
..wenn ich das einfach weglasse; gibt das ein Problem wenn man eine 2. Instanz des Browsers öffnet (manuell)?
Habe sowieso gerade noch etwas versucht (erfolglos), mit dem NewWindow2 - Event, damit bei einer Seite welche eine 2. öffnet nicht der Internet Explorer sondern wiederum mein Browser (oder allenfalls das Browserfenster bei 2. Seite.... ohne Silent) erscheint. _________________ ...längre blomstre gamle nord... |
|
Nach oben |
|
|
ThePuppetMaster
Anmeldungsdatum: 18.02.2007 Beiträge: 1837 Wohnort: [JN58JR]
|
Verfasst am: 24.02.2007, 09:23 Titel: |
|
|
Naja... ich sags mal so:
Du hast eine Form erstellt. Sie heisst "frmMain".
auf diese Formkannst du so zugreifen
"frmMain.<BlaBlub>"
Jetzt erstellst du eine Kopie, bzw eine neue Instanz von dieser
"Set BrowserForm = new frmmain"
heist so viel wie:
Set = Setzte Objekt
BrowserForm = Zu Setzendes neues Objekt (ziel)
= = Was in das Ziel rein soll
new = Neues Objekt (bzw. kopie eines bestehendes Objekt
frmMain = Die Quelle
Syntax:
Set <FormObjektFürNeueInstanz> = new <ObjektFürDieNeueInstanz>
Du erstellst also eine Kopie in deine Variable von deinem Original.
Wenn du nun in deiner Fav-Form aus auf "frmMain" zugreifst, dann greifst du auf das Original zu, und nicht auf die Kopie. Und in dem Original steht die startadresse drin, weil du mit dieser ja nicht arbeitest, sondern diese nu als "Vorlage" für die neuen Instanzen nutzt.
Wenn du von den Favs aus auf die Kopien zugreifen willst, breiben dir eigentlich nur ein paar Möglichkeiten
1. Du schickst die Aktuelle Adresse zuerst an die Fav-Form, befor du sie öffnest.
z.B. mit
Zitat: | FavForm.Tag = BrowserForm.X_URL
FavForm.Show(1) |
(.TAG ist sowas wie eine Allgemein nutzbare Variable, die jedes Objekt hat. (Typ = Variant = Kann man so gut wie alles drin speichern)
2. Du erstellst eien Variable, in der du das Aktive Form-Objekt als Poitner hniein schreibst, und greifst dann auf die Globale Variable zu, um daten zu erfassen
(Im Modul)
Zitat: | Public X_ActualBrowserForm as Objekt |
(In der BrowserForm)
Zitat: | Private Sub Form_Activate()
Set ActualBrowserForm = me
end sub
Private Sub Form_DeActivate()
Set ActualBrowserForm = nothing
end sub |
Damit hast du den verweis erstellt.
Aus der FavForm heraus kanst du dann mit
Zitat: | private Sub Command1_Click()
'URL übernehmen
Text1.Text = ActualBrowserForm.X_URL |
das sidn mal einfache Varianten, gibt auch noch Komplexere, mit Array-Objekten, aber das dürfte eigentlich so schon reichen.
MfG
TPM _________________ [ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ] |
|
Nach oben |
|
|
c.m.obrecht
Anmeldungsdatum: 09.03.2006 Beiträge: 377 Wohnort: Hofstetten SO, CH
|
Verfasst am: 24.02.2007, 11:42 Titel: |
|
|
Jetzt bin ich schon näher! Habe genau gedacht dass so etwas passiert...
Vielen Dank! Brauche ich die Deklarierung der Forms als Objekt überhaupt? Ist ja für eine MDI-Anwendung eigentlich...
---
Hab es jetzt mit dem Tag gelöst; und vom Favoriten-Form habe ich (da ja fMainForm = New frmMain) anstatt frmMain.WebBrowser1.Navigate (das holte wieder die Startseite, jetzt logisch) geschrieben fMainForm.WebBrowser1.Navigate ListIndex usw...
Findest Du das OK? Habe kompiliert und getestet, ob es auch geht wenn die ANwendung mehrfach gestartet wird; kein Problem (ausser ev. der Dateizugriff aber der ist ja sehr kurz). _________________ ...längre blomstre gamle nord... |
|
Nach oben |
|
|
ThePuppetMaster
Anmeldungsdatum: 18.02.2007 Beiträge: 1837 Wohnort: [JN58JR]
|
Verfasst am: 24.02.2007, 12:19 Titel: |
|
|
Jip .. kannste so lassen
für MDI is das egal, ... bei mehreren Gleichen Form's bzw. Instanzierst, wär es schon sinnvoll, wenn du das über Objektverweise machst (Set blablub = new bluna) ... anders kannst du auch keine Form kopieren.
Dateizugriff: Wen du wärend der Dateioperation kein "Doevents" verwendest, überschneidensich keine Funktionsaufrufe.
Ein Doevents übergibt den Prozess wieder Windows, wodurch das Programm sozusagen unterbrochen wird, um z.B. Mauseingaben auf Buttons, oder andere Aufgaben zu verarbeiten.
Mit Doevents sollte daher vorsichtig gearbeitet werden, da es den Aktuellen Prozess bzw. die Aktuelle Funktion an dieser stelle unterbricht, um andere aufgaben ab zu arbeiten, z.B. ein Timer-Event, oder eine Usereingabe.
Du kannst die auswirklungen ja mal untersuchen, z.B. so:
Zitat: |
private sub Form_Load()
Form1.Show
doevents '(Damit die Form angezeigt wird)
'Hier jetzt die eigentlichen DoEvents-Effekte
Dim Tot as double
Tot = timer + 10 '(10sek. wartezeit)
do
if tot < timer then exit do 'Wärend den 10 Sek. kannst du die form nicht verschieben, sie wird nicht neu gezechnet, wenn du etwas darüber ziehst, (bei selbst gemahlten Überflächen), keine Buttons können gedrückt werden, usw.
loop
End sub |
um dennoch Funktionsfehigkeit zu gewährleisten
Zitat: |
private sub Form_Load()
Form1.Show
doevents '(Damit die Form angezeigt wird)
'Hier jetzt die eigentlichen DoEvents-Effekte
Dim Tot as double
Tot = timer + 10 '(10sek. wartezeit)
do
if tot < timer then exit do
doevents 'Die arbeit bei jedem Zykluns an Windows abgeben. (Dadurch werden auf deinem Projekt eingaben möglich. Du kanst die Form verschieben, Timer werden aufgerufen, Buttons können gedrückt werden, usw.
loop
End sub
|
Wie gesagt, sollte vorsichtig damit umgegangen werden, da 2 aktive Programme, die gleichzeitg auf eien Datei zugreifen, dadurch sich gegenseitig behindern. Bei KEINER verwendung des DoEvents, wird das ausgeschlossen, da zuerst diese Funktion abgearbeitet werden muss.
Es gibt zwar noch ausnahmen, aber die sind nur via API zu erreichen.
[Nachtrag]
Ein Doevents, verlangsamt auch die DoLoop schleife!, das kannst du einfach damit kontrolieren, wenn du einen Zähler einbaust
Zitat: |
Dim X as long
do
...
x = x +1
Form1.caption = cstr(x)
...
loop
|
MfG
TPM _________________ [ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ] |
|
Nach oben |
|
|
c.m.obrecht
Anmeldungsdatum: 09.03.2006 Beiträge: 377 Wohnort: Hofstetten SO, CH
|
Verfasst am: 24.02.2007, 13:15 Titel: |
|
|
Ach so! Ja dann lasse ich es lieber.
Ich dachte, wenn bei beiden Browser-Instanzen gleichzeitig z.B. das Favoriten-Form geladen wird und das eine die Datei geöffnet hat und das andere das gleichzeitig tun möchte, dass es dann ein Problem geben kann. Aber der Zugriff ist ja so kurz, wird in der Praxis wohl kaum stattfinden (und dann kommt vermutlich die Meldung "Datei nicht vorhanden etc.). OK in dem Fall würde eine leere List angezeigt und beim schliessen des Forms die leere abgespeichert, die Datei überschrieben, das wäre nicht so geschickt. _________________ ...längre blomstre gamle nord... |
|
Nach oben |
|
|
ThePuppetMaster
Anmeldungsdatum: 18.02.2007 Beiträge: 1837 Wohnort: [JN58JR]
|
Verfasst am: 24.02.2007, 15:46 Titel: |
|
|
Du kannst dir ja eine kleine Funktion baun, die das ein udn aus liest, dann besteht auch keien Gefahr, wenn du kein "DoEvents" in dieser Funktion verwendest! ... Dann is das kein Problem, auch wenn das 2x offen is.
MfG
TPM _________________ [ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ] |
|
Nach oben |
|
|
|
|
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.
|
|