Permalänk
Medlem

Delphi problem =(

Så var det äntligen dags för mig att fråga om hjälp angående programmering i Delphi..

Jag har en form, från villken man kan, genom att klicka på en knapp, skapa och visa en annan form, i realtid.

Vill att huvudformen ska ligga "AlwaysOnTop", och detsamma gäller för den nya formen som skapas. Men problemet är att jag inte lyckas få den nya formen att förbli OnTop, hur kag än gör.

Bifogar ett demo-projekt som visar hur jag gör för att skapa den nya formen. Inga konsyigheter där alls. Men hur jag än gör (har provat att kalla SetTopMost-API:n, men icke) så försvinner den under andra fönster.

Börjar bli smått tokig nu, har jäklats med det i nästan två dagar nu.

Visa signatur
Permalänk
Medlem

Jag hade samma problem förut, dock i C++ Builder. Men det är ju samma sak så...
Iaf så löstes det för mig genom att sätta OnTop före jag skapade formen.

Vet dock inte om det är det som är problemet vid alla tillfällen.

Visa signatur

"I know not with what weapons World War III will be fought, but World War IV will be fought with sticks and stones." - Albert Einstein

Permalänk
Medlem

Hmm, du har ju inget åtkomst innan du har skapat den. Dvs, du kan inte ändra dess inställningar innan den finns.

Visa signatur
Permalänk
Medlem

Oj, det har du rätt i. Jag hade gjort som jag sa
Trodde det bara funkade att köra OnTop när man skapar formen, men så hade jag inte heller gjort.
Kollade in koden där jag gjorde det nu, och då använder jag bara this->FormStyle = fsStayOnTop;
Vet inte om det finns ngt liknande i delphi men det funkar iaf.

Visa signatur

"I know not with what weapons World War III will be fought, but World War IV will be fought with sticks and stones." - Albert Einstein

Permalänk
Medlem

Jo, FormStyle finns i Delphi också, men den verkar ignoreras i mitt fall.

När exakt tilldelar du fsStayOnTop, innan formen visas, efter, eller i designtime? Har provat alla dessa, men utan resultat..

Visa signatur
Permalänk
Medlem

Jag kan göra det när jag vill. Men om jag inte kör med 'this->' så funkar det aldrig.

Visa signatur

"I know not with what weapons World War III will be fought, but World War IV will be fought with sticks and stones." - Albert Einstein

Permalänk
Medlem

En något off topic fråga.

Har du gjort alla dina små trevliga program i Delphi, s.c.s.i.?

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av Phase
Jag kan göra det när jag vill. Men om jag inte kör med 'this->' så funkar det aldrig.

jag antar att "this" i builder motsvaras av "self" i delphi.. men jag har tyvärr provat det också..

Visa signatur
Permalänk
Medlem
Citat:

Ursprungligen inskrivet av Malm
Har du gjort alla dina små trevliga program i Delphi, s.c.s.i.?

Japps. Hurså?

Visa signatur
Permalänk
Avstängd

Sök efter funktionen ForceForegroundWindow på google eller googlegroups så får du lite färdig kod som fixar ditt problem.

Permalänk
Medlem

Hittar en funktion, som jag har använt tidigare, och som jag vet fungerar, men bara på huvudformen:

function ForceForegroundWindow(hWnd: THandle): BOOL; var hCurWnd: THandle; begin hCurWnd := GetForegroundWindow; AttachThreadInput( GetWindowThreadProcessId(hCurWnd, nil), GetCurrentThreadId, True); Result := SetForegroundWindow(hWnd); AttachThreadInput( GetWindowThreadProcessId(hCurWnd, nil), GetCurrentThreadId, False); end;

Inget rår på den jäkla nyskapade formen.

Visa signatur
Permalänk
Medlem

SetWindowPos(form2.handle, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOMOVE or SWP_NOACTIVATE or SWP_NOSIZE or SWP_NOSENDCHANGING); Form2.Show;

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av s.c.s.i.
Japps. Hurså?

Har fått för mig att Delphi är mindre kraftfullt och mer för nybörjare, men dina program verkar riktigt profsiga

Permalänk
Medlem

Ingen skillnad.

Visa signatur
Permalänk
Medlem

du har rätt!
fan! sry! ja försöker igen!

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av Malm
Har fått för mig att Delphi är mindre kraftfullt och mer för nybörjare, men dina program verkar riktigt profsiga

Hehe, tackar..

Men att Delphi skulle vara mindre kraftfullt, och för nybörjare är ju bara bull. Vart har du fått det ifrån?

Kolla på vad Delphi kostar, bara det faktum visar att det inte direkt är tänkt till nybörjare.

Snitsat från Dustin:

Citat:

Borland® Delphi™ 7 Studio Enterprise ger dig nya och fullt integrerade teknologier för förbättrad utvecklarproduktivitet. Du utvecklar dina applikationer så att de är klara för Microsoft® .NET Framework med hjälp av Delphi 7 Studio Migration Kit för .NET. Med ModelMaker visuell modellering baserad på UML™-teknologi utvecklar du effektivt dina applikationer och lägger till interaktivt innehåll för webbsajter genom att visuellt bygga dynamiska serverbaserade HTML webbapplikationer med AToZed Software IntraWeb. Dessutom ingår DataSnap™-teknologi (tidigare MIDAS), med vilken du får åtkomst till gratis, skalbar mellanvara för skapandet av flerlagers databaslösningar med företagskapacitet. Och med Borland Kylix™ 3 för Delphi-miljön, som också finns med i paketet, kan du överföra dina Windows®-applikationer för flera olika plattformar till Linux®, något som förbättrar företagets räntabilitetstal.

Edit: Quoten ovan säger inte så mycket, såg jag nu...

Visa signatur
Permalänk
Medlem

Testa detta:

unit Unit2;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs;

type
TForm2 = class(TForm)
private
{ Private declarations }
procedure CreateParams(var Params: TCreateParams); override;
public
{ Public declarations }
end;

var
Form2: TForm2;

implementation

{$R *.dfm}

{ TForm2 }

procedure TForm2.CreateParams(var Params: TCreateParams);
begin
inherited;
with Params do begin
ExStyle := ExStyle or WS_EX_TOPMOST;
WndParent := GetDesktopwindow;
Style := Style AND NOT WS_CAPTION;
end;

end;

end.

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av pucko
Testa detta:

code

Yay! Äntligen. Tackar så väldigt.

Visa signatur
Permalänk
Medlem
Citat:

Ursprungligen inskrivet av s.c.s.i.
Hehe, tackar..

Men att Delphi skulle vara mindre kraftfullt, och för nybörjare är ju bara bull. Vart har du fått det ifrån?

Kolla på vad Delphi kostar, bara det faktum visar att det inte direkt är tänkt till nybörjare.

Snitsat från Dustin:

Edit: Quoten ovan säger inte så mycket, såg jag nu...

Troligtvis eftersom Komputer hade några nybörjarkurser i det för ett antal år sedan

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av s.c.s.i.
Yay! Äntligen. Tackar så väldigt.

Ett stort problem dock: Jag behöver kunna bestämma i runtime om formen ska vara ontop eller inte. Detta låser den till OnTop.

Behöver nåt som fungerar fristående från FormCreate.

Visa signatur
Permalänk
Medlem
Citat:

Ursprungligen inskrivet av Malm
Troligtvis eftersom Komputer för alla hade några nybörjarkurser i det för ett antal år sedan

Du har väl sett en nybörjarkurs i c++ någon gång?

Visa signatur
Permalänk
Medlem

Inte i Komputer

Permalänk
Medlem
Citat:

Ursprungligen inskrivet av s.c.s.i.
Ett stort problem dock: Jag behöver kunna bestämma i runtime om formen ska vara ontop eller inte. Detta låser den till OnTop.

Behöver nåt som fungerar fristående från FormCreate.

SetWindowPos(Handle, HWND_TOPMOST, Left, Top, Width, Height, SWP_NOACTIVATE or SWP_NOMOVE or SWP_NOSIZE);

och
SetWindowPos(Handle, HWND_NOTOPMOST, Left, Top, Width, Height, SWP_NOACTIVATE or SWP_NOMOVE or SWP_NOSIZE)

för att sätta tillbaka till "icke topmost"

Såg inte att nån redan srkivit detta ^.

Jag tyckte att det verkade fungera om jag la det på

Form2.Button1Click (efter att ha kastat ut en knapp på form2)

Men jag är kanske för trött för att orka fattta vad som händer...

Permalänk
Medlem

Detta funkade för mig.

Om du ändå har problem med kåden så kan det bero på en liten bugg i Delphi 7 (som jag naturligtvis har lösningen på )

Visa signatur

www.filipsprogram.tk - lite freeware
"Delight, herregud. Talang är bara förnamnet."

Permalänk
Medlem

Pucko och Deligt, er kod har samma verkan, den nya formen hamnar ontop den gamla formen, och alla andra "formar" som hör till det programmet, med de hamnar inte ovanpå andra fönster.

Edit: Har verkligen funderat på om jag skulle kunna gå runt detta på något sätt, men har kommit fram till att jag _måste_ kunna bestämma om den nyskapade formen ska vara "alwaysontop".

Som sagt, följande kodsnutt gjorde jobbet:

procedure TForm2.CreateParams(var Params: TCreateParams); begin inherited; with Params do begin ExStyle := ExStyle or WS_EX_TOPMOST; WndParent := GetDesktopwindow; Style := Style AND NOT WS_CAPTION; end; end;

Men jag måste kunna slå på och av detta läga.

Ville bara revidera problemet.

Visa signatur
Permalänk
Medlem

*host*

procedure TForm1.Button1Click(Sender: TObject); var postit : TForm2; begin postit:=TForm2.create(nil); postit.Show; Application.NormalizeTopMosts end;

Visa signatur

www.filipsprogram.tk - lite freeware
"Delight, herregud. Talang är bara förnamnet."

Permalänk
Medlem

Fungerar finemang...

Är lite osäker på några saker dock.

Vad har denna snutt för uppgift? Fungerar nämlingen fint utan den:

procedure TForm1.CheckBox1Click(Sender: TObject);
var exstyle:integer;
begin
exstyle:=GetWindowLong(Handle, GWL_EXSTYLE);

if exstyle and WS_EX_TOPMOST=0 then
SetWindowLong(Handle, GWL_EXSTYLE, exstyle and not(WS_EX_TOPMOST))
else
SetWindowLong(Handle, GWL_EXSTYLE, exstyle or WS_EX_TOPMOST);

end;

Och vad fasen gör "Application.NormalizeTopMosts" egentligen?

Edit: Tack så mycket för hjälpen, förresten.

Visa signatur
Permalänk
Medlem

Det var tänkt att man skulle kunna ändra topmost för formen med den checkboxen. Angående Application.NormalizeTopMosts så finns den funktionen dokumenterad i hjälpen

Visa signatur

www.filipsprogram.tk - lite freeware
"Delight, herregud. Talang är bara förnamnet."