Attribuer Chaîne de Tableau de Caractères
Question Que L'On
J'ai
var example : array[0..15] of char;
Je veux attribuer la valeur d'une entrée à cette variable
example := inputbox('Enter Name', 'Name', '');
Dans les meilleurs scores de l'unité I de l'enregistrement et de la matrice de
type
points = record
var
_MemoryName : array[0..15] of char;
_MemoryScore : integer;
end;
var
rank : array[1..3] of points;
var s: string;
a: packed array[0..15] of char;
highscoresdata.position[1]._MemoryName := StrPLCopy(a, s, Length(a)) ;
retourne -> (186): E2010 Incompatible types: 'array[0..15] of Char' and 'PWideChar'
var s: string;
a: packed array[0..15] of char;
s := InputBox('caption', 'Caption', 'Caption');
FillChar(a[0], length(a) * sizeof(char), #0);
Move(s[1], a[0], length(a) * sizeof(char));
scores.rank[1]._MemoryName := <<tried both s and a>> ;
retourne (189): E2008 Incompatible types
- T1 Pourquoi utiliser une longueur fixe de tableau de char plutôt que d'une chaîne de caractères? T2 Vous n'appelez pas OnKeyPress, le cadre fait pour vous. Si vous souhaitez modifier le contenu d'un TEdit de contrôle puis d'écrire
Edit1.Text := 'my new text';
- T1 Pourquoi utiliser une longueur fixe de tableau de char plutôt que d'une chaîne de caractères? -- Je suis à l'aide d'un enregistrement dans un autre fichier qui ne supportent pas de cordes autant que moi, et d'autres que j'ai entendu de savoir. T2 Vous n'appelez pas OnKeyPress, le cadre fait pour vous. -- Je sais, Mais je veux l'appeler à partir d'un autre emplacement.
- Êtes-vous prêt pour le mariage de demain?
- J'ai traversé l'Atlantique pour s'éloigner d'elle. Hélas, les gens d'ici sont plus intéressés que dans le royaume-UNI!!
- Aha, c'est pourquoi vous n'avez pas ralenti comme vous l'avez promis. C'est, je comprends, vous êtes notation représentants à l'avance parce que vous devinez que vous ne pouvez pas être en mesure de toucher pendant un certain temps. Ai-je deviné? 🙂
- Vous vous demandez pourquoi vous ne pouvez pas affecter une chaîne en un tableau de caractères, et je vous dis comment faire. Ensuite, vous nous dites qu'il ne fonctionne pas, quand il le fait travailler. Ce qui ne fonctionne pas est une chose complètement différente! Votre problème n'est pas que la chaîne n'est pas affectés à la matrice, mais plutôt que vous ne savez pas comment faire pour copier des tableaux.
- (A) Une question par question, s'il vous plaît (B) Veuillez utiliser le peu de boutons de format et le format de votre code comme le code, donc c'est plus facile à lire! J'ai édité votre question pour vous.
- Oh ce que sur la terre avez-vous fait à cette question. Vous poser deux questions qui nous répondre. Ensuite, vous ré-écrire la question de la prise T2 et en le remplaçant par ce! Quel gâchis. Le vote pour la fermer comme trop "localisée".
- J'ai bien fait de lui demander de poser une seule question à la fois. 🙂
- si vous souhaitez stocker un enregistrement dans un fichier, il est logique d'utiliser des tableaux de Char au lieu de chaînes de caractères. De cette façon, vous pouvez stocker la totalité de l'enregistrement d'un seul coup, au lieu d'avoir à stocker le contenu de la chaîne avec un code supplémentaire.
- Si vous écrivez un enregistrement à un fichier en une seule fois, alors vous exposez à de graves problèmes de compatibilité. De toute façon, quand j'ai posé cette question dans un commentaire, je ne pouvais pas dire que l'opération était de stocker les enregistrements dans un fichier.
- J'ai simplement répondu pourquoi quelqu'un serait d'utiliser un tableau statique dans un registre qu'une chaîne de caractères ou un tableau dynamique. Il est encore un très commun de la procédure, AFAICT. FWIW, je suis au courant des changements dans le Char de taille entre D2007 et D2009 et comment cela aurait une incidence sur la taille de l'enregistrement.
Vous devez vous connecter pour publier un commentaire.
Question Que L'On
Il existe de nombreuses façons. L'un est:
Mais il y a peut être une solution plus élégante à votre problème, je pense.
Question Deux
Chaque fois que vous le souhaitez une fonction/procédure n'ai pas un argument particulier, vous devez réaliser qu'il pourrait y avoir un problème avec la conception du projet. Néanmoins, il n'est pas rare que
Sender
paramètres sont superflus, car ils sont presque omniprésente en raison de la conception de la VCL (en particulier, laTNotifyEvent
). Si vous savez que la procédure de réception ne se soucient pas de laSender
paramètre, il suffit de lui donner quoi que ce soit, commeSelf
ounil
.Question Trois
Considérer ce code:
Cela ne fonctionne pas. Vous ne pouvez pas traiter les tableaux comme des cordes; en particulier, vous ne pouvez pas affecter les tableaux statiques comme ceci (
a := b
).Au lieu de cela, vous avez à faire quelque chose comme...
...ou tout simplement de la boucle et de copier une valeur à la fois. Mais le simple ci-dessus affectation (
a := b
) fonctionne si vous déclarez un tableau statique de type:a
) comme un intermédiaire:StrPLCopy(_MemoryName, s, Length(_MemoryName))
ouMove(s[1], _MemoryName[0], Min(Length(s), Length(_MemoryName)) * SizeOf(Char))
. StrPLCopy retourne un pointeur vers le premier caractère de la destination, et vous ne pouvez pas affecter pointeurs de tableaux.StrPLCopy
😉packed array[...] of Char
spécialement, il appelle unpacked-string
, et la Type de Compatibilité et de l'Identité la documentation précise des règles supplémentaires pourpacked-string
, y compris la cession. Mais dans la pratique, la cession ne fonctionne pas, que ce code montre.Andreas vous a couvert pour la question 1.
Question 2
Je voudrais faire en sorte que votre gestionnaire d'événement appelé une autre méthode:
De cette façon, vous pouvez simplement appeler
RespondToEditControlKeyPress
directement.Je suppose que vous voulez l'appeler, sans paramètres parce que vous voulez le code à exécuter lorsque le contrôle d'édition de texte est modifié. Vous pourriez peut-être utiliser le
OnChange
événement à la place. Et il se peut queOnChange
est plus approprié, car en appuyant sur une touche n'est pas la seule façon d'obtenir de texte dans un contrôle d'édition.Par ailleurs, il est préférable de poser une question à la fois ici sur un Débordement de Pile.
Pour un moyen rapide pour copier de type " chaîne de valeurs dans un tableau de valeurs de type caractère. Je suggère un petit helper fonction comme ceci:
Chaque fois que vous appelez, le faire passer dans la longueur maximum pour être copié. Rappelez-vous que si la longueur de la mémoire tampon est de 15, vous devriez passer en 14 comme la maxlen, de sorte que vous laissez de la place pour la résiliation de nul caractère, si vous avez l'intention de toujours mettre fin à vos chaînes:
Cette fonction permettra de s'assurer que les données que vous copiez dans le dossier est null, en supposant qu'est ce que tu voulais. Rappelez-vous que dans un tableau de caractères de longueur fixe, c'est à vous de décider quelles sont les règles. Null? Entièrement rembourré avec des espaces ou des caractères null.... Les chaînes et les tableaux de caractères sont si différents qu'il existe de multiples façons possibles de conversion entre les deux.
Si vous n'avez pas l'intention de mettre fin à votre cordes avec nul, alors vous devriez utiliser le FillChar+combinaison de Bouger montré à quelqu'un d'autre répondre.
La réponse la plus évidente est bien sûr.
N'utilisez pas de paniers tableau de char.
Utiliser une chaîne à la place.
Si vous utilisez
ansistring
, 1 char, toujours sur 1 octet.Si vous utilisez
shortstring
idem.Ansistring est compatible avec
Pchar
qui est un pointeur vers unepacked array of char
.De sorte que vous pouvez écrire
Quelques conseils
Il ressemble au votre, sont la traduction de code de c à Delphes.
un
packed array of char
est exactement la même que l'ancienne (1995)shortstring
moins la longueur en octets au début deshortstring
.La seule raison pour laquelle je peux penser à utiliser
packed array of char
est lors de la lecture des données vers et à partir d'un disque, et que vous avez le code de legs que vous ne voulez pas changer.Je voudrais garder l'héritage de code à lire et à écrire à partir de la disquette et ensuite transférer les données dans un
ansistring
et à partir de là, utilisez uniquementansistring
.C'est tellement plus facile, Delphi fait tout pour vous.
Et...
ansistring
est beaucoup plus rapide, est automatiquement créé et détruit, peut avoir n'importe quelle longueur (jusqu'à 2 go), utilise moins mémoire --parce que des chaînes identiques seulement obtenir stockés qu'une seule fois (ce qui signifiestringa:= stringb
où une chaîne de 20 caractères au moins 5x plus rapide en utilisant ansistrings que du tableau de char).Et bien sûr, le meilleur de tous, débordement de la mémoire tampon d'erreurs sont impossibles avec
ansistring
.Ce sujet
unicodestring
?Unicodestring est très bien à utiliser, mais parfois la traduction de caractères qui se passe lors de la conversion entre
packed array of char
et unicodestring, donc je recommande d'utiliseransistring
dans ce contexte.Ce que vous essayez de faire est impossible, en effet:
Qui tente d'affecter un pointeur (le résultat de StrPLCopy, un PWideChar dans les dernières versions de Delphi) à un tableau, qui est en effet impossible. Vous ne pouvez pas copier un tableau comme ça. Je voudrais faire:
Qui devrait fonctionner, et de l'OMI, la solution la plus simple pour copier une chaîne dans un tableau de caractères. Il n'y a pas besoin de l'utiliser comme une sorte d'intermédiaire, et l'aide est, IMO, plutôt faible et donc un peu difficile (il est facile d'oublier de multiplier par la taille de caractère, elle n'est pas cochée, il n'ajoute pas de #0, etc.), surtout si vous ne savez pas exactement ce que vous êtes en train de faire.
Cette solution devrait même fonctionner pour les versions de Delphi avant de Delphi 2009, comme il ne dépend pas de la taille du caractère.
FWIW, je ne voudrais pas utiliser des paniers tableaux. Paniers n'ont pas de sens dans le courant de Delphi, mais pourrait confondre le compilateur et de faire les types incompatibles.