/ Forside / Teknologi / Udvikling / Delphi/Pascal / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Delphi/Pascal
#NavnPoint
oldwiking 603
jrossing 525
rpje 520
EXTERMINA.. 500
gandalf 460
gubi 270
DJ_Puden 250
PARKENSS 230
technet 210
10  jdjespers.. 200
focus på form
Fra : Michael Vilhelmsen


Dato : 30-12-03 14:41

hej

Jeg har lavet to temmelig store applicationer i D5 Ent.
Begge applicationer åbner en hovedform, hvorfra der kan åbnes adskillige
andre forme.

Langt de fleste forme bliver lavet on runtime og vist som ShowModal (da
programmet skal afslutte et vindue inden der må fortsættes).
Dette gør jeg således:


begin
try
MyForm1 := TMyForm1.Create(nil);
MyForm1.ShowModal;
finally
MyForm1.Release;
MyForm1 := nil;
end;
end;

Problemet er bare at en gang imellem bliver en form (dette gælder alle
forme, men ikke konsekvent) vist ganske hurtigt, hvorefter en anden
application ligger foran.
Den application som så ligger forrest er ikke den aktive application. Det er
stadigvæk min appl.
For at få focus på min egen appl. igen, skal jeg enten vælge den på
bundlinien (selvom den allerede er valgt) eller trykker ALT+TAB for at
skifte til en anden og igen ALT+TAB for at få min appl. forrest.

For mig selv er dette lligegyldit, men det er det ikke for vores kunder.
De kan simpelthen ikke finde ud af det.

Jeg har så prøvet på en given form i formshow, at skrive
Application.BringToFront.
Det hjalp ikke.

Jeg ved snart ikke hvad jeg skal gøre for at løse problemet.

Jeg benytter på en del af disse forme rxLib's TFormStorage comp.
Men jeg ved ikke om det har noget at sige.

Nogen der kan hjælpe ?

Michael



 
 
Harald (30-12-2003)
Kommentar
Fra : Harald


Dato : 30-12-03 15:09

"Michael Vilhelmsen" <smom22@hotmail.com> skrev i en meddelelse
news:3ff18065$0$123$edfadb0f@dread11.news.tele.dk...
> hej
>
> Jeg har lavet to temmelig store applicationer i D5 Ent.
> Begge applicationer åbner en hovedform, hvorfra der kan åbnes adskillige
> andre forme.
>
> Langt de fleste forme bliver lavet on runtime og vist som ShowModal (da
> programmet skal afslutte et vindue inden der må fortsættes).
> Dette gør jeg således:
>
>
> begin
> try
> MyForm1 := TMyForm1.Create(nil);
> MyForm1.ShowModal;
> finally
> MyForm1.Release;
> MyForm1 := nil;
> end;
> end;
>
> Problemet er bare at en gang imellem bliver en form (dette gælder alle
> forme, men ikke konsekvent) vist ganske hurtigt, hvorefter en anden
> application ligger foran.
> Den application som så ligger forrest er ikke den aktive application. Det
er
> stadigvæk min appl.
> For at få focus på min egen appl. igen, skal jeg enten vælge den på
> bundlinien (selvom den allerede er valgt) eller trykker ALT+TAB for at
> skifte til en anden og igen ALT+TAB for at få min appl. forrest.

Mener at dette skulle være den korrekte måde at lave forme on runtime men om
det giver en forskel ved jeg ikke:

Application.CreateForm(TMyForm1, MyForm1);

ellers prøv med disse:

SetForegroundWindow(Application.DINMAINFORM.handle);
SetActiveWindow(DINFORM.handle);
BringWindowToTop(DINFORM.handle);

Der står en masse om disse kald i Win32 Developer´s References hjælpen.

Har self bøvlet med et ligende problem en gang og fandt ud af at der også
var forskel på hvordan programmet opførte sig afhængig om man brugte windows
98 eller 2000.

Mvh
HK



Michael Vilhelmsen (30-12-2003)
Kommentar
Fra : Michael Vilhelmsen


Dato : 30-12-03 15:19

Jeg prøve.

Takker foreløbig

Michel

"Harald" <news10@-REMOVE-THIS-kroning.dk> skrev i en meddelelse
news:3ff18705$0$27394$edfadb0f@dread16.news.tele.dk...
> "Michael Vilhelmsen" <smom22@hotmail.com> skrev i en meddelelse
> news:3ff18065$0$123$edfadb0f@dread11.news.tele.dk...
> > hej
> >
> > Jeg har lavet to temmelig store applicationer i D5 Ent.
> > Begge applicationer åbner en hovedform, hvorfra der kan åbnes adskillige
> > andre forme.
> >
> > Langt de fleste forme bliver lavet on runtime og vist som ShowModal (da
> > programmet skal afslutte et vindue inden der må fortsættes).
> > Dette gør jeg således:
> >
> >
> > begin
> > try
> > MyForm1 := TMyForm1.Create(nil);
> > MyForm1.ShowModal;
> > finally
> > MyForm1.Release;
> > MyForm1 := nil;
> > end;
> > end;
> >
> > Problemet er bare at en gang imellem bliver en form (dette gælder alle
> > forme, men ikke konsekvent) vist ganske hurtigt, hvorefter en anden
> > application ligger foran.
> > Den application som så ligger forrest er ikke den aktive application.
Det
> er
> > stadigvæk min appl.
> > For at få focus på min egen appl. igen, skal jeg enten vælge den på
> > bundlinien (selvom den allerede er valgt) eller trykker ALT+TAB for at
> > skifte til en anden og igen ALT+TAB for at få min appl. forrest.
>
> Mener at dette skulle være den korrekte måde at lave forme on runtime men
om
> det giver en forskel ved jeg ikke:
>
> Application.CreateForm(TMyForm1, MyForm1);
>
> ellers prøv med disse:
>
> SetForegroundWindow(Application.DINMAINFORM.handle);
> SetActiveWindow(DINFORM.handle);
> BringWindowToTop(DINFORM.handle);
>
> Der står en masse om disse kald i Win32 Developer´s References hjælpen.
>
> Har self bøvlet med et ligende problem en gang og fandt ud af at der også
> var forskel på hvordan programmet opførte sig afhængig om man brugte
windows
> 98 eller 2000.
>
> Mvh
> HK
>
>



Claus Christiansen (30-12-2003)
Kommentar
Fra : Claus Christiansen


Dato : 30-12-03 22:28

"Harald" <news10@-REMOVE-THIS-kroning.dk> wrote in
news:3ff18705$0$27394$edfadb0f@dread16.news.tele.dk:

> "Michael Vilhelmsen" <smom22@hotmail.com> skrev i en meddelelse
> news:3ff18065$0$123$edfadb0f@dread11.news.tele.dk...
<klip>
>> Langt de fleste forme bliver lavet on runtime og vist som ShowModal
>> (da programmet skal afslutte et vindue inden der må fortsættes).
>> Dette gør jeg således:
>>
>> begin
>> try
>> MyForm1 := TMyForm1.Create(nil);
>> MyForm1.ShowModal; finally
>> MyForm1.Release;
>> MyForm1 := nil; end; end;
>>
>> Problemet er bare at en gang imellem bliver en form (dette gælder
>> alle forme, men ikke konsekvent) vist ganske hurtigt, hvorefter en
>> anden application ligger foran.
>> Den application som så ligger forrest er ikke den aktive
>> application. Det er stadigvæk min appl.
>> For at få focus på min egen appl. igen, skal jeg enten vælge den på
>> bundlinien (selvom den allerede er valgt) eller trykker ALT+TAB for
>> at skifte til en anden og igen ALT+TAB for at få min appl. forrest.

Jeg tvivler på at det har noget med dit problem at gøre men din kode bør
være følgende (altså flytte Create uden for try, da en exception Create
ellers vil resultere i endnu en exception når du forsøger at release en
form der ikke er oprettet):

MyForm1 := TMyForm1.Create(nil);
try
MyForm1.ShowModal;
finally
MyForm1.Release;
MyForm1 := nil;
end;


Lige lidt tillægsspørgsmål:
- sker fejlen både når der er "trejdeparts" programmer åbne og når dit
program er det eneste?
- hvilket OS kører du med?
- kan du fremprovokere det samme med et "nyt" program der "kun" åbner
vinduer (altså uden modellag/funktionalitet)?

> Mener at dette skulle være den korrekte måde at lave forme on
> runtime men om det giver en forskel ved jeg ikke:
>
> Application.CreateForm(TMyForm1, MyForm1);
<klip>

Hvis du anvender ovenstående bør/kan/må du ikke selv release formen efter
brug.

/Claus
--
Claus Christiansen, <mailto:NOSPAM@unipeople.dk>, leave the adr. as it is
personal: <http://unipeople.dk/~cch>; pythia: <http://www.pythia.dk>
===========================================================--------------
"Computers are useless. They can only give you answers" - Pablo Picasso

Michael Vilhelmsen (02-01-2004)
Kommentar
Fra : Michael Vilhelmsen


Dato : 02-01-04 08:41

>
> MyForm1 := TMyForm1.Create(nil);
> try
> MyForm1.ShowModal;
> finally
> MyForm1.Release;
> MyForm1 := nil;
> end;

Denne giver jeg dig.
Det er vist også den måde jeg oftest gør det på.....


>
>
> Lige lidt tillægsspørgsmål:
> - sker fejlen både når der er "trejdeparts" programmer åbne og når dit
> program er det eneste?
Det sker i alle situationer. Det ene af mine programmer sammen med andre,
begge mine sammen med andre, og min alene.

> - hvilket OS kører du med?

Windows 2000, Windows XP og Windows 98SE.

> - kan du fremprovokere det samme med et "nyt" program der "kun" åbner
> vinduer (altså uden modellag/funktionalitet)?

Har ikke prøvet.
Har for sjovt lavet et lille bitte program, som ikke kan andet end at lave
nogle nye vinduer.
Har for sjovt prøvet at putte nogle komb på, men har endnu ikke kunne få
fejlen her.
Problemet er jo også, at det ikke er konsekvenet.
Det vil sige, at jeg hos en kunde kan kører det perfekt det meste af dagen,
for pludselig at indtræffe en hel del gange i løbet af kort tid....

Michael



Tom-Vidar Nilsen (02-01-2004)
Kommentar
Fra : Tom-Vidar Nilsen


Dato : 02-01-04 11:52


> Problemet er jo også, at det ikke er konsekvenet.
> Det vil sige, at jeg hos en kunde kan kører det perfekt det meste af
dagen,
> for pludselig at indtræffe en hel del gange i løbet af kort tid....


Vist du leser de linkene jeg sendte deg i gruppen, vil du finne at 2000/XP
kan
nekte vinduer å komme til front om det er menyer som vises. Mulig det er
grunnen.



Tom-Vidar Nilsen (31-12-2003)
Kommentar
Fra : Tom-Vidar Nilsen


Dato : 31-12-03 01:14

> hej
>
> Jeg har lavet to temmelig store applicationer i D5 Ent.
> Begge applicationer åbner en hovedform, hvorfra der kan åbnes adskillige
> andre forme.
.....
> Langt de fleste forme bliver lavet on runtime og vist som ShowModal (da
> programmet skal afslutte et vindue inden der må fortsættes).
> Problemet er bare at en gang imellem bliver en form (dette gælder alle
> forme, men ikke konsekvent) vist ganske hurtigt, hvorefter en anden
> application ligger foran.
> Den application som så ligger forrest er ikke den aktive application. Det
er
> stadigvæk min appl.
.....
> Nogen der kan hjælpe ?

Ta en titt på denne siden :

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui
/windowsuserinterface/windowing/windows/windowreference/windowfunctions/anim
atewindow.asp

Dersom linken ikke virker, gå til msdn, søk på "AllowSetForegroundWindow"

Vet ikke om det hjelper deg, men du kan jo prøve.
Funksjonen svar også om du får lov eller ikke, dette kan du jo logge, eller
gjøre noe annet fornuftig.

Det står også en del på denne siden om når ditt program IKKE kan gjøre
dette.

Om du får til denne funksjonen, så gi tilbakemelding om hvordan du brukte
den.

Tilsvarende i mitt nåværende program , skjuler/viser setup formen :

procedure TFloatFrm.SetupBtnClick(Sender: TObject);
begin
If (SetupFrm<>Nil) and (SetupFrm.Visible) Then Begin
SetupFrm.Hide;
SetupFrm.Close;
SetupFrm.Free;
SetupFrm:=Nil;
End Else Begin
// Automatisk plassering av ny Setupform
SetupFrm.Top:=Top;
If Left>SetupFrm.Width
Then SetupFrm.Left:=Left-SetupFrm.Width
Else
If SetupFrm.Width<(Screen.Width-(Left+Width))
Then SetupFrm.Left:=Left+Width
Else SetupFrm.Left:=0;
SetupFrm.Show;
SetupFrm.BringToFront;
End;
end;




Tom-Vidar Nilsen (31-12-2003)
Kommentar
Fra : Tom-Vidar Nilsen


Dato : 31-12-03 02:47

Fant mer nyttig stoff i denne sammenhengen :

Windows 98/2000 doesn't want to foreground a window when
some other window has the keyboard focus.
ForceForegroundWindow is an enhanced SetForeGroundWindow/bringtofront
function to bring a window to the front.


http://www.swissdelphicenter.ch/torry/showcode.php?id=261



Søg
Reklame
Statistik
Spørgsmål : 177580
Tips : 31968
Nyheder : 719565
Indlæg : 6409081
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste