Domanda

Significa che non posso condividere un modulo tra delphi 2007 e 2009?

È stato utile?

Soluzione

Sì. Non è possibile a meno che non si rimuovano le proprietà non pubblicate in Delphi 2007 da DFM.

Altri suggerimenti

DoubleBuffered è in TWinControl da qualche tempo. La differenza in Delphi 2009 è che è ora pubblicato. Se riesci a vivere ignorando solo gli errori (e non facendo invece funzionare le proprietà), ecco una possibile soluzione:

unit Delphi2009Form;

interface

uses
  Windows, Classes, SysUtils, Controls, Forms;

type
{$IFDEF VER200}
  TDelphi2009Form = class(TForm);
{$ELSE}
  TDelphi2009Form = class(TForm)
  private
    procedure ReaderError(Reader: TReader; const Message: string; var Handled: Boolean);
  protected
    procedure ReadState(Reader: TReader); override;
  end;

  TReaderErrorProc = procedure(const Message: string);

var
  ReaderErrorProc: TReaderErrorProc = nil;
{$ENDIF}

implementation

{$IFNDEF VER200}
type
  THackReader = class(TReader);

procedure TDelphi2009Form.ReaderError(Reader: TReader; const Message: string; var Handled: Boolean);
begin
  with THackReader(Reader) do
    Handled := AnsiSameText(PropName, 'DoubleBuffered') or AnsiSameText(PropName, 'ParentDoubleBuffered');
  if Handled and Assigned(ReaderErrorProc) then
    ReaderErrorProc(Message);
end;

procedure TDelphi2009Form.ReadState(Reader: TReader);
begin
  Reader.OnError := ReaderError;
  inherited ReadState(Reader);
end;
{$ENDIF}

end.

Quindi modificare le dichiarazioni dei moduli nel progetto da ereditare da TDelphi2009Form, ad es .:

type
  TFormMain = class(TDelphi2009Form)
  ...

Funzionerà in fase di esecuzione - gli errori di proprietà verranno ignorati. Per farlo funzionare anche in fase di progettazione, creare un pacchetto di sola progettazione, aggiungere designide.dcp alla sua clausola obbligatoria e aggiungere la seguente unità:

unit Delphi2009FormReg;

interface

uses
  Delphi2009Form;

procedure Register;

implementation

uses
  DesignIntf, DesignEditors, ToolsAPI;

procedure ShowReaderError(const Message: string);
begin
  with BorlandIDEServices as IOTAMessageServices do
    AddTitleMessage(Message);
end;

procedure Register;
begin
  RegisterCustomModule(TDelphi2009Form, TCustomModule);
  ReaderErrorProc := ShowReaderError;
end;

initialization

finalization
  ReaderErrorProc := nil;

end.

Installa il pacchetto nell'IDE di Delphi 2007 e gli errori di proprietà per le proprietà DoubleBuffered e ParentDoubleBuffered verranno ignorati automaticamente all'apertura dei moduli nell'IDE. I valori delle proprietà andranno persi quando si salva il modulo in Delphi 2007, quindi è necessario inizializzarli nel codice.

MODIFICA : ho aggiunto un codice per generare i messaggi di errore del lettore nella finestra Messaggi IDE:

Messaggi di errore IDE

I progetti Delphi sono sempre stati estremamente facili da trasferire alle nuove versioni. Devi stare più attento, ma anche usare il codice corrente con compilatori più vecchi è piuttosto semplice. Ho mantenuto il codice in Delphi 2005/2006/2007 che altre persone dovevano ancora usare in Delphi 6 e 7.

Se rimuovi le proprietà incompatibili dai DFM, dovrebbero funzionare correttamente nelle versioni precedenti senza rovinarle per Delphi 2009. L'esempio più grande sono le proprietà esplicite * introdotte in Delphi 2006. Ho una scrubber DFM prodotta in casa " ; che li toglie. Ricorda, queste proprietà esistono per un motivo, quindi dovresti solo strofinare quelle che intendi essere compatibili con le versioni precedenti.

Potresti anche considerare di investire in strumenti di analisi del codice statico come CodeHealer o Pascal Analyzer. Oltre a evidenziare i problemi (in particolare CodeHealer) e aiutarti a ripulire il codice, puoi scegliere la versione di Delphi da analizzare, rendendo più facile trovare incompatibilità oltre alle proprietà di DFM. E possono essere automatizzati come parte del processo di creazione.

Solo una nota. Condividi il codice sorgente, ma mantieni progetti separati per ogni versione. Ciò è particolarmente importante tra Delphi 2007 e Delphi 2009. Il file .dproj più recente utilizza la stessa estensione, ma non è compatibile con Delphi 2007. Potresti anche imbatterti in un problame con risorse incompatibili.

Ogni modulo ha un file dfm che contiene le impostazioni delle proprietà del modulo e dei suoi componenti. Alcuni valori di proprietà hanno valori predefiniti, quindi non vengono memorizzati se viene mantenuto il valore predefinito. È stato appena fatto un piccolo test:

  • Crea un modulo nel 2009
  • Aggiungi un paio di controlli standard
  • Salva
  • Aprilo nel 2006 (scusate no 2007 su questo pc)

E ha funzionato senza messaggi. Ma forse non sei così fortunato.

Con Delphi, spesso è un po 'problematico condividere i dati tra le versioni. L'upgrade delle possibilità è ottimo, ma il downgrade è problematico. Quindi sconsiglio di condividere file di moduli tra versioni diverse.

Per quanto ne so, non è possibile aggiungere definizioni condizionali nel file dfm. Ma poi, vogliamo davvero che ... Preferirei un meccanismo che ignori le proprietà sconosciute.

Puoi tranquillamente aggiungere le proprietà nel codice nel tuo metodo OnCreate per il modulo e racchiuderle intorno a {$ IFDEF VER200} // NUOVE PROPRIETÀ {$ ENDIF}. Puoi lasciare DoubleBuffered al di fuori di ifdefs, poiché era presente in Delphi 2007, ma non disponibile per l'ispettore di proprietà.

Dovrai preoccuparti SOLO delle proprietà che hai impostato diversamente da quelle predefinite. Per il doppio buffer, devi preoccuparti di questo solo se è impostato su true.

Quando carichi il modulo Delphi 2009 in Delphi 2007, riceverai un avviso che una proprietà verrà distrutta, prendi nota di quelle proprietà, poiché quelle sono quelle che dovrai affrontare.

Sto usando questo metodo per migrare il mio codice a Delphi 2009 da Delphi 2006. La maggior parte dei miei progetti contiene diverse unità condivise e devo compilare in Delphi 2006 per la versione di spedizione e Delphi 2009 per il "prossimo" pubblicazione. Faccio anche ampio uso di {$ IFDEF UNICODE} per definire dove devo assicurarmi che una stringa si allarghi o risponda in base alla routine.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top