J'utilise un inspecteur d'objet TMS au moment de l'exécution, mais supposons que ma question serait également valable pour Delphi au moment de la conception.
Je veux avoir une propriété qui peut être définie programmairement (au moment de l'exécution) ou codé dur (au moment de la conception). Il devrait être visible pour l'utilisateur car les informations lui sont utiles et il doit être modifiable au moment de l'exécution par le programme, mais pas par l'utilisateur via l'inspecteur d'objet. P>
J'ai essayé p> < Pré> xxx pré>
et la propriété est visible, mais il est également modifiable dans l'inspecteur d'objets (et jette une exception en lecture de l'adresse Zer0 lorsqu'elle est modifiée): - ( P> P>
3 Réponses :
Le moyen le plus simple:
private procedure SetFileName(Value: string); published property FileName: string read FFileName write SetFileName; .... procedure TMyClass.SetFileName(Value: string); begin FFileName := FFileName; end;
Merci de prendre le temps de répondre. J'ai essayé cela, mais l'utilisateur peut modifier la valeur via l'inspecteur d'objets, ce que je ne veux pas. La propriété a un fond blanc, de même que tous les autres et peuvent être édités. Je préférerais qu'il ait un fond gris (comme une ligne fixe sur une grille à cordes) et que l'utilisateur ne doit pas être autorisé à changer sa valeur. (Si nous ne pouvons pas voir comment faire cela, je vais le faire privé, mais je préférerais l'avoir publié)
Oui, Mawg, la propriété peut être éditée. Mais après l'édition, le contrôle continue-t-il d'afficher la nouvelle valeur éditée? Cela ne devrait pas, parce que la valeur du champ sous-jacent n'a pas été modifiée. Si la nouvelle valeur apparaît, c'est un autre bogue dans la commande TMS; Dans l'inspecteur de véritable objet, le code de Ken réussirait à créer une propriété affichée au moment de la conception, mais qui ignore les tentatives de la modification.
@Mawg: Il n'y a aucun moyen, Afaict, de faire une propriété en lecture seule désactivée. Mais les utilisateurs devraient comprendre assez rapidement que tenter de changer cela ne fait rien; Frapper Entrée ou quitter la propriété le renverse à la valeur précédente (en lecture seule), comme @rob mentionné.
Ceci ressemble à une propriété parfaitement valide et correcte Propriété for forte> //Only writable during runtime.
private
procedure SetFileName(Value: string);
published
property FileName: string read FFileName write SetFileName;
....
procedure TMyClass.SetFileName(Value: string);
begin
if csDesigning in Componentstate then {do nothing}
else FFileName:= Value;
end;
Ceci est clairement un bogue dans l'inspecteur TMS Object et vous devez déposer un rapport de bogue avec TMS. P>
Cela pourrait être par conception. Oh, attends ... sauf la partie écrasante. :-)
Vous continuez à supposer que le contrôle TMS fonctionne de la même manière que l'inspecteur d'objets de Delphi. S'il vous plaît, arrêtez de le faire. Ce n'est pas le cas. Cette fois, la différence est que l'inspecteur d'objets n'est même pas Afficher les propriétés en lecture seule i>, de sorte que cette chose à propos de "lire l'adresse 0" ne s'applique pas simplement et semble être un bug avec TMS .
@Rob, il y a un paramètre que vous pouvez basculer pour rendre l'inspecteur d'objet Delphi Afficher les propriétés réadonnées (ou non) i>. C'est quelque part dans la boîte de dialogue Outils-> Options.
Solution de contournement rapide: déposez l'inspecteur de la propriété TMS et utilisez le Jedi un.