Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 20
  1. #1

    [C++Builder] Errore di linkaggio .obj

    Ho un progetto che possiede molte form che apro correttamente col comando Form2->ShowModal();
    Funziona tutto, salvo, e continua a funzionare, ma se aggiungo o modifico un oggetto, o se chiudo tutto e lo vado a riaprire mi dà questo errore e non funfola più nulla:

    [Link Error]Unresolved external '_F_2520'referenced from c:\"path"\nome.obj

    perché capita? perché continua a tormentarmi???


    Grazie per le future risposte

  2. #2
    devi andare a modificare un'opzione nei settaggi del linker, però non ho il c builder sottomano per dirti!

  3. #3
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,296

    Re: [C++Builder] Errore di linkaggio .obj

    Originariamente inviato da Ephestus

    perché capita? perché continua a tormentarmi???
    Mi sembra un errore esclusivo del linker, non necessariamente legato a caratteristiche del tuo progetto.

    Se non ricordo male, i cosiddetti "file oggetto" di C++Builder hanno estensione .dcu, come in Delphi, pertanto sembrerebbe non trattarsi di un errore dovuto a qualcosa di "malevolo" nel tuo progetto, anche se involontario.

    Hai tentato di effettuare un'operazione di Build esplicita del tuo progetto, che permette cioè di forzare la rigenerazione dei file semicompilati e dell'eseguibile?

    Ottieni lo stesso errore anche compilando progetti diversi da quello in esame?
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  4. #4
    Ebbene ho capito...io creavo una form che ha di base il suo nome Form1, compilavo e si crava il .obj

    Poiché io non aggiungo ogni oggetto a mano, ma mi baso su vecchi progetti (li prendo e li copio all'interno) il nuovo nome della form non veniva settata "a mano", ma cambiata come se fosse il nome di default. L'obj, che evidentemente ha al suo interno le informazioni di linkaggio dei nomi non viene aggiornato al build e quindi non trova la form!
    Ho risolto cambiando a mano, prima di copiarci le nuove impostazioni, il nome.

    Ed ecco che funziona!

    Grazie dell'aiuto!

    Anzi ne approfitto per farvi un'altra domanda (sempre che si possa fare nello stesso thread....al massimo ne creo, dopo richiamo da parte di un moderatore, uno nuovo)

    Poiché esiste una form madre e le successive sono figlie, se dentro ad una di quest'ultime metto Close(); mi chiude solo l'ultima e non la madre. Qual è il modo per chiudere tutte le form aperte?

  5. #5
    fai un close alla madre

  6. #6
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,296
    Originariamente inviato da Ephestus
    Ed ecco che funziona!
    Non ho ben capito la "dinamica" dell'incidente e la sua soluzione, ma so per certo che si tratta di manovre molto rischiose.

    In ogni caso, quando effettui delle copie, cancella gli OBJ poichè vengono ricreati dal compilatore.

    Originariamente inviato da Ephestus
    Poiché esiste una form madre e le successive sono figlie, se dentro ad una di quest'ultime metto Close(); mi chiude solo l'ultima e non la madre. Qual è il modo per chiudere tutte le form aperte?
    A meno che tu non abbia usato una MDI Form, cioè una form in grado di contenere una o più finestre figlie al suo interno, non esiste tecnicamente alcun grado di parentela tra le form di un'applicazione, non esiste alcuna "madre" o "figlia"; per chiudere l'applicazione, occorre chiudere la MainForm (form principale)...se invece vuoi chiudere una o più form aperte in sequenza con ShowModal, ti basta inserire una chiamata al metodo Close della form inferiore successiva alla chiamata al metodo ShowModal della form da visualizzare "sopra".
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  7. #7
    Originariamente inviato da alka
    A meno che tu non abbia usato una MDI Form, cioè una form in grado di contenere una o più finestre figlie al suo interno, non esiste tecnicamente alcun grado di parentela tra le form di un'applicazione, non esiste alcuna "madre" o "figlia"; per chiudere l'applicazione, occorre chiudere la MainForm (form principale)...se invece vuoi chiudere una o più form aperte in sequenza con ShowModal, ti basta inserire una chiamata al metodo Close della form inferiore successiva alla chiamata al metodo ShowModal della form da visualizzare "sopra".
    Bhé il fatto di madre e figlia era per farmi capire:
    una form da cui si sviluppa tutto il programma (madre) e quelle che nascono da lei (figlie). comunque eviterò in futuro di chiamarle così

    Si effettivamente potrei fare:
    codice:
    //Evento bottone della Form1
    Form2->ShowModal();
    Close();
    
    //Evento bottone Form2 per tornare indietro
    Form1->ShowModal();
    Close();
    
    //Evento bottone Form2 per chiudere
    Close();
    Però speravo ci fosse il modo per chiuderle entrambe dalla Form2 (nel caso in cui la Form1 non fosse già stata chiusa)

  8. #8
    Moderatore di Programmazione L'avatar di alka
    Registrato dal
    Oct 2001
    residenza
    Reggio Emilia
    Messaggi
    24,296
    Devo dire che programmo da diversi anni e un'esigenza come la tua non mi era mai capitata...tra l'altro, non conosco programmi che usano questo tipo di approccio: sei sicuro che sia la soluzione più adatta e, soprattutto, la più intuitiva?

    A parte questo, fai attenzione ai memory leak: C++Builder, come Delphi, non è "garbage collected", quindi devi occuparti di distruggere tutto ciò che crei.
    Se le tue form sono in "Auto create", allora vengono create all'inizio, utilizzate quante volte vuoi e distrutte alla chiusura del programma, liberando la memoria allocata; altrimenti, se le tue form vengono create nel momento in cui è necessario e successivamente distrutte (generalmente, con le finestre di dialogo modali si fa così), allora devi garantirti che l'istanza della finestra sia distrutta quando termini di usarla, anche in caso di errore.

    In Delphi si usa una forma congeniale di questo tipo:
    codice:
    MyForm := TMyForm.Create(Application);
    try
      MyForm.ShowModal;
    finally
      MyForm.Free;
    end;
    Il costrutto try...finally, che dovrebbe essere presente anche in C++Builder, garantisce che la form creata, anche in caso di errore, dopo la sua visualizzazione venga distrutta (con il conseguente rilascio della memoria) attraverso il metodo Free.

    Ovviamente, è possibile fare questo solo con ShowModal, poichè la chiamata a questo metodo blocca l'esecuzione della routine fino a quando la finestra visualizzata non viene chiusa.

    Ciao!
    MARCO BREVEGLIERI
    Software and Web Developer, Teacher and Consultant

    Home | Blog | Delphi Podcast | Twitch | Altro...

  9. #9
    BOIA! VVoVe:


    Ci darò un'occhiata dopo pranzo...
    mhhh pranzo....
    Adoro la pausa pranzo.. e manca ancora un'ora....
    Che pacco...


    scusa per l'intercalare....dicevo...ahh sì...dopo pranzo ci provo e ti faccio sapere come va...

    grazie!

  10. #10
    Alka il tuo modo di chiudere le form mi dà qualche problema...
    usando però la funzione Close(); per chiudere solo l'ultima finestra aperta (ovvero per tornare indietro) e exit(0); per chiudere tutto l'eseguibile è molto più semplice e veloce...


    Grazie infinite comunque!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.