Toon posts:

[VB6.0] Dialoog en MDI-Child (document) probleem

Pagina: 1
Acties:

Verwijderd

Topicstarter
Het probleem: Ik heb een gewoon dialoogvenster gemaakt, dit dialoogvenster wil ik als functie geven om in een MDI-Child-venster te zoeken.

Het programma:
frmMain: MDI-Form waarin via het menu Bewerken>Zoeken het zoek-dialoogvenster gestart word
frmDocument: Het documentformulier waar MDIChild = True. Deze bevat een RTF-text Control (rtfTextBox).
frmSearch: Het zoekdialoogvenster. Deze bevat een invoerveld (txtSearch) voor een zoekterm en een knop om te zoeken (cmdSearch)

Eerste Poging: De code (achter frmSearch):
QBasic:
1
2
3
4
5
6
7
Private Sub cmdSearch_Click()
  Dim strSearch As String
 
  strSearch = txtSearch.Text
  lngStart = frmMain.ActiveForm.rtfTextBox.Find(strSearch, lngStart, , 0)
    
End Sub


Gedachte achter de code: Je typt een tekst in het invoerveld van frmSearch en je drukt op cmdSearch. Dan neemt de code het over en zoekt uit wat je hebt ingetypt. Vervolgens geeft het aan het actieve document (frmMain.ActiveForm) aan dat in het rtfTextBox daarvan gezocht moet worden naar die tekst (rtfTextBox.Find())

Dit geeft de volgende foutcode: Run-time Error '426': Only one MDI Form Allowed
MSDN: http://msdn.microsoft.com...ml/vbmsgobjOneMDIForm.asp

Goed, werkt niet: Tweede Poging:
QBasic:
1
2
3
4
5
6
Private Sub cmdSearch_Click()
  Dim strSearch As String

  strSearch = txtSearch.Text
  lngStart = frmDocument.rtfTextBox.Find(strSearch, lngStart, , 0)
End Sub


Deze geeft geen foutmelding, maar hij doet iets compleet anders dan dat ik bedoelde. Hij laad een nieuw frmDocument, met als titel frmDocument, en doet daar vervolgens niets.

Het systeem:
Visual Basic 6.0 SP6 op Windows 98SE

  • Dennis
  • Registratie: Februari 2001
  • Laatst online: 18:37
Uhm, als je deze code gebruikt bij het creëren van een frmDocument:

code:
1
2
Dim varfrmDocument as frmDocument
Set varfrmDocument = new frmDocument


En je probeert hem aan te spreken met varfrmDocument, heeft dat enig effect?

Verwijderd

Topicstarter
Dan geeft hij, hoe en waar ik op die manier ook frmDocument creeër de volgende melding:
Run-Time error '424': Object required (dus niet alleen als ik heb plaatselijk declareer, maar ook als ik hem niet-plaatselijk declareer)

Verwijderd

Als je het nu eens anders aanpakt, zodat je searchform geen directe link naar het form waar je rtftext op staat heeft ?

- Declareer een Globale variabele SearchControl van het type Control

- Zet in de OnActivate van alle forms waar je zoekbare rtfTextBoxen SearchControl naar het control waarin je wilt zoeken ( vergeet niet Set te gebruiken )
code:
1
Set searchcontrol = [rtfcontrol op dit form]

Dit in de OnActivate doen heeft als bijkomend voordeel dat je zoeken ook gaat werken wanneer je meerdere forms hebt met zoekbare controls, de rtfbox van de meest recent gebruikte form staat namelijk in SearchControl

- Zet in al die forms in de formunload
code:
1
if Searchcontrol = [rtfcontrol op dir form] then set searchcontrol = nothing

Deze controle zorgt ervoor dat je niet toevallig de link naar een control op een ander form verwijderd ( kan voorkomen als je forms vanuit code sluit ).

- Bouw je zoekcode om naar
code:
1
Searchcontrol.find(.....)


Bovenstaande code is waarschijnlijk niet direct bruikbaar ( ik heb hier geen VB voor mijn neus, anders zou ik het wel ff uitproberen ), maar ik denk dat je de strekking van het verhaal wel snapt.

Verwijderd

Topicstarter
Heb het anders gedaan. Maar het lijkt dat hij het doet, ookal doet hij het niet perfect. Hij laat het gevondenen pas zien als ik het Zoeken-dialoogvenster afsluit.

Hoe ik het heb gedaan:
In een module:
code:
1
Public SearchControl As Control

Het zoekvenster word opgeroepen via het menu bewerken:
code:
1
2
3
4
5
6
7
Private Sub mnuEditSearch_Click()
  If ActiveForm Is Nothing Then Exit Sub
  
  Set SearchControl = ActiveForm.rtfTextBox
  frmSearch.Show
  
End Sub

En dan als je op Zoeken drukt:
code:
1
2
3
4
5
6
Private Sub cmdSearch_Click()
  Dim strSearch As String
  
  strSearch = txtSearch.Text
  lngStart = SearchControl.Find(strSearch, lngStart, , intOptions)
End Sub


Het eenigste probleem dat ik nu nog heb is dat het hij zoekresultaat pas weergeeft (geselecteerd) als ik het dialoog frmSearch afsluit. Hij doet al wel doorzoeken (dus tweemaal hetzelfde zoeken enzo).

[ Voor 14% gewijzigd door Verwijderd op 20-05-2004 10:36 ]


  • Dennis
  • Registratie: Februari 2001
  • Laatst online: 18:37
En als je een .setfocus gebruikt nadat de zoekopdracht eigenlijk is voltooid?

Verwijderd

Het eenigste probleem dat ik nu nog heb is dat het hij zoekresultaat pas weergeeft (geselecteerd) als ik het dialoog frmSearch afsluit. Hij doet al wel doorzoeken (dus tweemaal hetzelfde zoeken enzo).
Je searchform is modal zeker ? je zult daar dan een normaal form van moeten maken, en via een API-call het form "always on top" moeten maken ( code daarvoor kun je op het net vinden, op sites als www.freevbcode.com en www.codehound.com

Verwijderd

Topicstarter
Mischien offtopic vraagje: maar waarom doet hij
code:
1
lngStart = frmMain.activeform.rtftextbox.find(strSearch, lngStart, , intOptions)
niet en
code:
1
2
Set SearchControl = ActiveForm.rtfTextBox
 lngStart = SearchControl.Find(strSearch, lngStart, , intOptions)
wel
ddc schreef op 20 mei 2004 @ 10:50:
En als je een .setfocus gebruikt nadat de zoekopdracht eigenlijk is voltooid?
Eerst even uitzoeken hoe we dat via het zoekformulier doen. Want als ik gewoon zeg frmMain.Activeform.setfocus geeft hij de al bekende run-time error '426': Only one MDI-Form allowed

aanvulling:
Als ik frmDocument handmatig de focus geef door ergens erop te klikken (bijvoorbeeld titelbalk) dan werkt dat wel (het gezochte word geselecteerd) maar het zoekdialoog verdwijnt achter alle andere vensters. Dit ah dik opgelost met vbModal mee te geven aan frmSearch.Show (frmSearch is een 3 - Fixed Dialog)

[edit]
Verwijderd schreef op 20 mei 2004 @ 11:58:
[...]

Je searchform is modal zeker ? je zult daar dan een normaal form van moeten maken, en via een API-call het form "always on top" moeten maken ( code daarvoor kun je op het net vinden, op sites als www.freevbcode.com en www.codehound.com
Always on Top had ik er al inzitten (hoofdvenster), zal het even testen en ombouwen.

[edit]
Always on top op frmSearch werkt maar:
- Tekst in frmDocument word nog steeds pas geselecteerd nadat ik het frmSearch verlaat
- En nu heb ik er een probleem bij bdat frmSearch boven alle applicaties licht

[ Voor 29% gewijzigd door Verwijderd op 20-05-2004 12:17 ]


Verwijderd

Topicstarter
*Schopje

- Alles wat in het topic genoemd word is al geprobeerd.

Wat is nou het probleem:
IK heb een zoekvenster gemaakt (zoals zoeken in kladblok) waarmee je in een documentvenster kan zoeken. Het documentvenster is een MDI-child. Het zoeken enzo lukt nu wel, maar het resultaat word pas weergegeven naardat Zoeken is afgesloten of er op het document (de titelbalk) is gedrukt. .setfocus op het frmDocument werkt niet, en als ik frmSearch Always on Top meegeef, zie je hem boven alle vensters (bovendien lost dat nog steeds niet het probleem van het niet zien van het gezochte op)
Pagina: 1