PDA

Visualizza la versione completa : [DELPHI] Come far lampeggiare la finestra.


CaMpIoN
11-04-2011, 22:20
Ciao, vorrei sapere come far lampeggiare la finestra, sia dal form che da barra delle applicazioni in delphi, ho trovato qualcosa come FlashWindow ma in un progetto dll mi dice Undeclared Identifier penso che la prenda come variabile perchè la funzione non esiste allora se non è questa qual'è?

Edit: Ho capito che dovevo usare la libreria Windows, ora però mi sorge un'altro problema l'handle non può essere un double allora cosa dev'essere?

alka
12-04-2011, 09:48
Quando hai un errore, posta sempre la descrizione precisa e anche il codice sorgente che hai scritto.

CaMpIoN
12-04-2011, 11:04
Ieri sera sono riuscito a risolvere non dandomi piu errori, però mi capita che mi fa bloccare il programma che usa la DLL, quindi per questo spiego piu precisamente ciò che faccio.
Codice sorgente completo DLL:



library DLL;

uses
SysUtils,Classes,Windows;

function Flash(hand:LongInt):Longint; cdecl;
begin
FlashWindow(hand,true);
Result:=1;
end;

exports Flash;


In questo caso non mi da nessun errore, al programma passo come argomento l'handle della finestra con una funzione apposita del programma che per precisare è Game Maker, mi capita che usando questa funzione in delphi funziona usandola in una DLL su un'altro programma il programma crasha e non risponde, poi so' che si può scegliere cosa far lampeggiare tra finestra e icona del programma dalla barra applicazioni, provando in delphi funziona però se scrivo la funzione application.hand al posto di hand solo, mi da errore, appena lo scrivo mi da questo:
Unable to invoke Code Completion due to errors in source code
poi andando su Project sopra nella barra dei menu e scegliendo Build DLL mi da questi due errori:

[Error] DLL.dpr(36): Undeclared identifier: 'application'
[Error] DLL.dpr(36): Not enough actual parameters

Da quel che ho capito il primo errore esce perchè prende application come variabile, mentre nel secondo dice che i prametri non sono giusto, se non è cosi qual'è l'errore? come posso correggerlo?

Sto facendo un po' di casino :P, comunque preciso che in un Progetto Applicazione funziona in entrambi i modi con application e senza application...
Grazie mille e scusatemi per il casino :D.

alka
12-04-2011, 11:16
Originariamente inviato da CaMpIoN
funziona però se scrivo la funzione application.hand al posto di hand solo, mi da errore, appena lo scrivo mi da questo [...]
Da quel che ho capito il primo errore esce perchè prende application come variabile, mentre nel secondo dice che i prametri non sono giusto, se non è cosi qual'è l'errore? come posso correggerlo?

Diciamo che non si è capito nulla. :)

Tra l'altro, parli di errori di compilazione e hai postato invece l'unica versione del codice che compila correttamente.

Oltre a questo, mi sembra che tu stia andando abbastanza a caso, per tentativi, senza seguire una certa logica, sia nella scrittura del codice sia nel suo utilizzo; in questo caso, c'è poco da stupirsi se ottieni degli errori, così come non c'è da stupirsi se non è possibile darti un aiuto significativo in quanto mancano tutti gli elementi per capire cosa tu stia realmente facendo, né esiste la possibilità di indirizzarti se usi gli strumenti del linguaggio e le funzioni un po' a casaccio. :)

CaMpIoN
12-04-2011, 11:22
Non direi proprio a casaccio, queste soluzioni le ho trovate facendo ricerche, e tra quelle che piu ho provato quella che ho messo è la piu precisa che ho trovato..

alka
12-04-2011, 11:27
Originariamente inviato da CaMpIoN
Non direi proprio a casaccio, queste soluzioni le ho trovate facendo ricerche, e tra quelle che piu ho provato quella che ho messo è la piu precisa che ho trovato..

Sì, ma poi modifichi la soluzione pensando di ottenere un certo risultato, senza però approfondire prima gli elementi a cui cambi posto, o che inserisci nel codice.

Ad ogni modo, non ho ancora capito se tutto quanto ora funziona oppure no.

Se la risposta è negativa, non postare il codice che funziona: posta quello che è sbagliato, altrimenti è impossibile dirti dov'è l'errore.

CaMpIoN
12-04-2011, 11:44
Parlo prima di quello che dovrebbe funzionare e non da errori:
Questo che posto è quello che non da errori di sintassi, ed è quello che ho trovato più preciso:


library DLL;

uses
SysUtils,Classes,Windows;

function Flash(hand:LongInt):Longint; cdecl;
begin
FlashWindow(hand,true);
Result:=1;
end;
exports Flash;

Da Progetto Application ho provato solo la funzione FlashWindow in una procedure button, e funziona perfettamente sia con Handle che che con Application.Handle...
Poi dopo aver verificato che la funzione funzionasse ho provato a farne la dll con il codice postato sopra.. così come ho scritto il codice non da errore di sintassi, ma usando la DLL dal programma, il programma si blocca e crasha.

L'errore di sintassi delphi me lo da postando questo codice, perchè come ho letto Application.Handle fa lampeggia l'icona dalla barra delle applicazioni, mentre solo Handle fa lampeggiare la finestra, nel precedente la funzione ha come argomento hand il cui indicherò dal programma dove uso la dll l'handle della finestra del programma.
Questo è il codice dove mi dà errore di sintassi:


library DLL;

uses
SysUtils,Classes,Windows;

function Flash(hand:LongInt):Longint; cdecl;
begin
FlashWindow(application.hand,true);
Result:=1;
end;
exports Flash;

gli errori riportati sono i seguenti:


[Error] DLL.dpr(36): Undeclared identifier: 'application'
[Error] DLL.dpr(36): Not enough actual parameters


Bhe spero di essere stato piu chiaro almeno stavolta :D...

deleted_29
12-04-2011, 11:56
la risposta è abbastanza semplice.

l'handle altro non è che l'handle "nel senso windows", ovvero della API32.

Questo esiste per ogni finestra windows, anche per la finestra principale dell'applicazione delphi (* nota, qui ci andrebbero 74 precisazioni, ma non le faccio perchè siamo in modalità niubbo-like *)

E' quindi "normale" che un programma delphi "normale" abbia un handle, mentre una DLL no.

In questo caso devi passare alla DLL l'handle della finestra dell'applicazione che chiama la DLL.

---
Per inciso: ma che senso ha fare DLL in delphi? Se c'è una cosa "bella" è quella di poter far programmi monolitici, altro che approcci stile-100.000.dll che non funzionano! (es. VB e "cugini") :mem:

alka
12-04-2011, 12:41
Originariamente inviato da CaMpIoN
...


FlashWindow(application.hand,true);

gli errori riportati sono i seguenti:


[Error] DLL.dpr(36): Undeclared identifier: 'application'
[Error] DLL.dpr(36): Not enough actual parameters


Bhe spero di essere stato piu chiaro almeno stavolta :D...

Questo conferma esattamente quello che ti stavo dicendo nei precedenti messaggi.

L'oggetto Application si trova nella unit Forms e viene creato quando lavori con un'applicazione VCL Forms in Delphi; nel tuo caso, stai creando una DLL, invocabile anche da altri ambienti e linguaggi, quindi è normale che tu non abbia a disposizione - in generale - l'oggetto Application.

Anche se tu ce l'avessi, non puoi inserire l'identificatore Application senza includere la unit (Forms) nella clausola uses, altrimenti il compilatore non è in grado di individuarlo.

Oltre a questo, l'oggetto Application non possiede una proprietà hand, ma tutt'al più una proprietà Handle.

Non ha nemmeno senso che tu utilizzi direttamente quell'oggetto, altrimenti cosa te ne fai del parametro che hai aggiunto nella funzione definita nella DLL?

Come dicevo prima, il fatto che tu abbia visto un pezzo di codice con scritto Application.Handle (e non "hand") non significa che questo possa essere utilizzato indistintamente ovunque; è un po' come affermare che, avendo visto un cuoco utilizzare il burro, questo si possa mettere in qualsiasi pietanza. :)

Da qui la mia contestazione iniziale: il fatto di andare a caso non si riferiva al codice che scrivi (anche se si applicherebbe anche a questo), ma al modo in cui utilizzi indiscriminatamente istruzioni prelevate da listati che fanno tutt'altro o si riferiscono a tipi di progetti completamente differenti dal tuo.

Secondo me, ti conviene fare un passo indietro e approfondire meglio il linguaggio e i principi fondamentali della libreria VCL; in seguito potrai "evolvere" in soluzioni più complesse.

Ciao! :ciauz:

alka
12-04-2011, 12:42
Originariamente inviato da franzauker
Per inciso: ma che senso ha fare DLL in delphi?

Se devi condividere funzioni con altre applicazioni o linguaggi che devono importarle, a livello nativo non è che ci sono tante altre soluzioni. :)

Loading