2010-06-03 3 views
1

J'aide ma société avec un vieux code delphi 7.Valeur booléenne par défaut dans un tableau d'enregistrement - Delphi

Il existe un enregistrement déclaré au début qui est utilisé pour stocker toutes les données que nous voulons afficher.

Type
TOutput_Type = fiche
résultat: String;
resultoffset: Chaîne;
selected: booléen;
résultatcatégorie: nombre entier;
fin;

et ensuite un tableau de c'est déclaré

Sortie: tableau de TOutput_Type;

La longueur est définie au début sur une valeur élevée, car la longueur réelle est inconnue.
Ce tableau est utilisé partout mais, malheureusement, la valeur sélectionnée n'est pas toujours définie lors de l'utilisation.
Mon problème est que j'ajoute un résumé des données, mais parce que selected n'est pas défini, delphi semble lui donner un statut aléatoire vrai ou faux.
Existe-t-il un moyen de définir toutes les instances de selected comme vrai au début? On dirait une chose assez simple à faire, mais je ne suis pas un programmeur Delphi donc je ne sais pas si c'est possible? Je sais que je peux passer et ajouter: selected = true chaque fois qu'un nouveau record est fait, mais je voudrais le faire proprement au début si possible ....
Merci d'avance

Répondre

5

Après avoir appelé la variable SetLengt for Output, vous devez d'abord initialiser les nouvelles parties de l'enregistrement (car la nouvelle mémoire allouée n'est pas définie) dans la boucle for. Quelque chose comme:

OldLength := Length(Output); 
SetLength(Output, NewLength); 
for n := OldLength to NewLength -1 do 
    Output[n].selected := True; 
+1

Ce n'est pas complètement correct. SetLength zero-initialise la mémoire allouée qui rend les valeurs booléennes fausses par défaut. –

+0

Merci pour votre suggestion; Je l'ai essayé et cela prend beaucoup de temps.Le problème est le tableau est mis en place avec une longueur de 0 (pour effacer le tableau), puis une longueur d'environ 57000 :) prend quelques minutes pour traiter ... – James

+0

@VilleK: De l'aide de Delphi: "Pour une longue chaîne ou variable dynamique-array, SetLength réaffecte la chaîne ou le tableau référencé par S à la longueur donnée Les caractères existants dans la chaîne ou les éléments du tableau sont conservés, mais le contenu de l'espace nouvellement alloué n'est pas défini. " –

-2

Je ' d aller pour la méthode usine comme dans la question dcp liée à. Les constructeurs sans paramètre ne sont pas autorisés pour les enregistrements, vous devrez donc toujours spécifier certains paramètres, ce qui peut être gênant si vous n'en avez pas vraiment besoin.

Si tout cela est sur l'initialisation du contenu du grand tableau une fois au début vous pouvez aussi utiliser ceci:

SetLength(Output, MyArbitraryItemCount); 
FillChar(Output[0], Length(Output)*SizeOf(TOutput_Type), 1); 

Ensuite, tout est compris 1. selected :) Bien sûr, vous pouvez également utiliser un pour -loop ...

+2

Résultat de la recherche: String; Pointer ($ 01010101) n'est pas une bonne idée. – Alex

+0

Ou tout type géré, d'ailleurs. –

+0

Doh. J'ai oublié le type géré. Très bon point! –

3

Records, à la différence des objets, ne sont pas initialisés lors de la création, de sorte que vous devez les initialiser vous. Puisque vous êtes sur Delphi 7, vous ne pouvez pas utiliser les enregistrements avec des méthodes, donc je ferais une fonction d'initialisation, quelque chose comme ceci:

type 
    TOutputArray: array of TOutput_Type; 

function CreateOutputArray(length: integer): TOutputArray; 
var 
    i: integer; 
begin 
    SetLength(result, MyArbitraryItemCount); 
    FillChar(result[0], Length(Output)*SizeOf(TOutput_Type), 0); 
    for i := 0 to high(result) do 
    result[i].selected := true; 
end; 
+0

léger problème avec l'exemple - vous utilisez la longueur en tant que paramètre, puis essayez d'utiliser la fonction Longueur. Je suppose que vous vouliez appeler le paramètre MyArbitraryItemCount –

+0

@Gerry: Oui, quelque chose comme ça. –

Questions connexes