yoghisan
Messages postés204Date d'inscriptionsamedi 10 mai 2003StatutMembreDernière intervention 2 juin 2005
-
23 nov. 2003 à 16:59
cs_Delphiprog
Messages postés4297Date d'inscriptionsamedi 19 janvier 2002StatutMembreDernière intervention 9 janvier 2013
-
25 nov. 2003 à 22:52
Bonjour,
Voila je suis entrain de m'essayer a la création de composant et pour cela, je suis entrain d'essayer de faire une table de vérité. Le composant n'est pas fini mais déjà j'ai un probleme que je n'arrive pas a résoudre correctement. C'est un truc tout bete mais embetant.
Je vous laisse mon code pour comprendre ce que je dis ci-dessous.
Pour mon composant, je me base sur un panel sur lequel je pose d'autres panels et pour faire simple, je n'arrive pas a les rendre invisible quand il est juste poser juste la fiche ? Et ca, ca m'embete ...
Je sais que je peux faire d'autres choix de programmation mais j'aimerais quand meme trouver une solution a ca
Merci pour les courageux qui regarderont mon truc
Yoghi
unit ComposantTable_de_verite;
interface
uses
SysUtils, Classes, Controls, ExtCtrls,Graphics, math,Dialogs;
type
TComposantTable_de_verite = class(Tpanel)
private
variable:array[1..4] of Tpanel;
variable_binaire:array[1..4,1..16] of Tpanel;
reponse:array[1..4] of Tpanel;
reponse_binaire:array[1..4,1..16] of Tpanel;
FEntree: Integer;
FSortie: Integer;
procedure SetEntree(const Value: Integer);
procedure SetSortie(const Value: Integer);
procedure PanelMouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
protected
procedure Draw;
public
constructor Create(AOwner: TComponent); override;
destructor Destroy; override;
published
property Entree: integer read FEntree write SetEntree;
property Sortie: integer read FSortie write SetSortie;
property OnClick;
property OnDblClick;
property OnMouseDown;
property OnMouseMove;
property OnMouseUp;
end;
const carre=30;
espace=8;
procedure Register;
implementation
procedure Register;
begin
RegisterComponents('Logique', [TComposantTable_de_verite]);
end;
constructor TComposantTable_de_verite.Create(AOwner: TComponent);
var i,j:integer;
pair_ou_impair:integer;
begin
inherited;
for i:=1 to 4 do begin
variable[i]:=Tpanel.create(self);
with variable[i] do begin
parent:=self;
width:=carre;
height:=carre;
top:=espace;
left:=espace+(i-1)*carre;
color:=clskyblue;
caption:='e'+inttostr(i);
font.Style:=[fsBold];
end;
reponse[i]:=Tpanel.create(self);
with reponse[i] do begin
parent:=self;
width:=carre;
height:=carre;
top:=espace;
left:=espace+4*carre+espace+(i-1)*carre;
color:=clmoneygreen;
caption:='S'+inttostr(i);
font.Style:=[fsBold];
end;
for j:=1 to 16 do begin
variable_binaire[i,j]:=Tpanel.create(self);
with variable_binaire[i,j] do begin
parent:=self;
width:=carre;
height:=carre;
top:=espace+j*carre;
left:=espace+(i-1)*carre;
pair_ou_impair:=((j-1) div (trunc((Power(2,i-1)))))-1;
tag:=(trunc(Power(-1,pair_ou_impair))+1) div 2;
caption:=inttostr(tag);
end;
reponse_binaire[i,j]:=Tpanel.create(self);
with reponse_binaire[i,j] do begin
parent:=self;
width:=carre;
height:=carre;
top:=espace+j*carre;
left:=espace+4*carre+espace++(i-1)*carre;
tag:=(i*espace)+j;
cursor:=crhandpoint;
onmousedown:=PanelMouseDown;
end;
end;
end;
SetEntree(2);
SetSortie(1);
Draw;
end;
destructor TComposantTable_de_verite.Destroy;
begin
inherited;
end;
procedure TComposantTable_de_verite.SetEntree(const Value: Integer);
begin
case value of
1..4: FEntree:=value;
else
FEntree:=2;
end;
Draw;
end;
procedure TComposantTable_de_verite.SetSortie(const Value: Integer);
begin
case value of
1..4: FSortie:=value;
else
FSortie:=1;
end;
Draw;
end;
procedure TComposantTable_de_verite.Draw;
var i,j:integer;
nbr_ligne:integer;
begin
caption:='';
nbr_ligne:=trunc(Power(2,FEntree));
for i:=1 to 4 do begin
variable[i].Visible:=false;
reponse[i].Visible:=false;
for j:=1 to 16 do begin
variable_binaire[i,j].Visible:=false;
reponse_binaire[i,j].Visible:=false;
end;
end;
for i:=1 to FEntree do begin
variable[i].Visible:=true;
for j:=1 to nbr_ligne do variable_binaire[i,j].Visible:=true;
end;
for i:=1 to FSortie do begin
reponse[i].Visible:=true;
reponse[i].left:=espace+FEntree*carre+espace+(i-1)*carre;
for j:=1 to nbr_ligne do begin
reponse_binaire[i,j].Visible:=true;
reponse_binaire[i,j].left:=espace+FEntree*carre+espace+(i-1)*carre;
end;
end;
Width :=espace+FEntree*carre+espace+FSortie*carre+espace;
Height:=espace+(nbr_ligne+1)*carre+espace;
End;
procedure TComposantTable_de_verite.PanelMouseDown(Sender:TObject; Button:TMouseButton; Shift:TShiftState; X,Y:Integer);
begin
with sender as tpanel do begin
if caption='' then caption:='1';
if caption='1' then caption:='0' else caption:='1';
end;
end;
end.
cs_Delphiprog
Messages postés4297Date d'inscriptionsamedi 19 janvier 2002StatutMembreDernière intervention 9 janvier 201332 23 nov. 2003 à 21:41
Dans le constructeur Create, il manque la désignation du parent :
inherited;
Parent := AOwner as TWinControl;
J'attire aussi ton attention sur les points suivants :
1- Dans la méthode Draw la ligne :
nbr_ligne := trunc(Power(2, FEntree));
est invraisemblablement compliquée. FEntree est du type Integer et 2..aussi ! Le résultat sera OBLIGATOIREMENT un entier. Dans ce cas, pourquoi vouloir faire une troncature ?
2- Dans le constructeur :
pair_ou_impair := ((j - 1) div (trunc((Power(2, i - 1))))) - 1;
tag := (trunc(Power(-1, pair_ou_impair)) + 1) div 2;
Que de complications inutiles alors que la fonction Odd indique si le paramètre reçu est impair. Pour affecter la propriété Tag, il suffit de transtyper le booléen en Longint.
3- Dans PanelOnMouseDown :
with sender as tpanel do
begin
if caption = '' then
caption := '1';
if caption = '1' then
caption := '0'
else
caption := '1';
end;
Revient à faire ceci :
with sender as tpanel do
begin
if caption = '' then
caption := '0'
else
caption := '1';
end;
Je n'ai pas approfondi le reste du code, tu m'en excuseras.
Régle générale : quand un composant créé dynamiquement fonctionne mais ne s'affiche pas, c'est quand on a oublié de renseigner sa propriété parent.
May Delphi be with you
yoghisan
Messages postés204Date d'inscriptionsamedi 10 mai 2003StatutMembreDernière intervention 2 juin 20051 23 nov. 2003 à 23:59
Merci beaucoup pour tes critiques constructives, elle me permet de voir mes erreurs et de progresser plus rapidement.
Pour le commentaire 0 :
OK
Pour le commentaire 1 :
C'est une mauvais habitude que j'ai pris de mettre integer partout, des que j'ai des nombres entiers, pan integer. Cependant, je me sers de cette variable dans un FOR I:=1 TO NBR_LIGNE DO... Je peux mettre un autre type à cette variable ?
Pour le commentaire 2 :
La fonction ODD, je ne connaissais pas. C'est comme a chaque fois par ignorance, je me complique bien la vie mais ca fait parti de la phase d'apprentissage... De toute facon, j'ai trouvé une autre formule plus simple.
Pour le commentaire 3 :
La, je ne suis pas trop d'accord avec ta proposition.
Je travaille sur l'evenement OnClick, Bref.
On débute avec un panel vide, je lui affecte donc un contenu
IF caption='' THEN caption:='0';
Mais apres le contenu doit basculer de 0 à 1 ou de 1 à 0 a chaque evenement
IF caption='1' THEN caption:='0' ELSE caption:='1';
Mais avec ce que tu me proposes, ca reste a 1 tout le temps.
Pour le dernier commentaire :
Mon composant créé dynamiquement fonctionne et s'affiche mais moi, c'est le contraire, je ne peux pas (avant la compilation de la fiche, cad, en création) rendre invisible les panels que j'ai collé sur mon composent... Et ca, je pige pas du tout.
Pour conclure :
En tout cas, merci beaucoup d'avoir pris du temps de regarder ca. Vraiment merci et surtout n'arrete pas. D'ailleurs, j'en ai beaucoup entendu parler de ton site en bien, reverra t il un jour le jour ?
cs_Delphiprog
Messages postés4297Date d'inscriptionsamedi 19 janvier 2002StatutMembreDernière intervention 9 janvier 201332 24 nov. 2003 à 08:55
J'ai peut-être regardé un peu vite le point 3 !
Ce qui est bien, c'est que tu argumentes chaque remarque faite.
Commentaire 1
Au contraire, reste sur des Integer.
Commentaire 2
La fonction Odd fait partie des instructions de base du Pascal et prend comme paramètre n'importe quelle valeur appartenant à un ensemble scalaire. Mais tu n'es pas le seul à l'ignorer d'après ce que je peux voir.
Commentaire 3
Comme je le disais, j'ai pris un raccourci un peu trop rapidement. Celà serait valable si la propriété Caption était initialisée à 0 ou à 1. C'est toi qui as raison.
Commentaire 4 Une petite astuce pour basculer ta propriété Tag de 0 à 1 et inversement :
Tag := Tag XOR 1;
C'est encore plus rapide !
Bonne continuation, tu es sur la bonne voie !
May Delphi be with you
Vous n’avez pas trouvé la réponse que vous recherchez ?
Quel con... Je fais des composants relatifs a la logique binaire et donc je suis sensé contraire les fonctionnalités de base et je ne pense meme pas à utiliser le ou exclusif...
Bref mais ca ne resoud pas mon probleme principal.
Pour voir mon probleme, il faut installer le composant et le poser sur une fiche. Il ne ressemble pas a ce qu'il devrait etre (c'est a dire a ce que l'on voit une fois le source executé).
Pourrais tu regarder ca de plus pres s'il te plait et me donner ton avis ? Bien sur si tu en as le temps et l'envie.
cs_Delphiprog
Messages postés4297Date d'inscriptionsamedi 19 janvier 2002StatutMembreDernière intervention 9 janvier 201332 24 nov. 2003 à 18:49
"C'est celui qui le dit qui y est " :big)
Je regarderai ce soir, mais en instanciant ton composant dans le code, sans rien faire de plus, tout a l'air normal !
cs_Delphiprog
Messages postés4297Date d'inscriptionsamedi 19 janvier 2002StatutMembreDernière intervention 9 janvier 201332 24 nov. 2003 à 23:38
Instancier : créer une instance d'une classe.
Une classe, c'est comme un plan d'une maison. Une maison est une instance de la classe PlanDeMaison.
C'est plus clair comme çà ?
Instanciation dans le code :
procedure TForm1.FormCreate(Sender: TObject);
var
TableDeVerite: TComposantTable_de_verite;
begin
TableDeVerite := TComposantTable_de_verite.Create(Self)
end;
Pour tester un composant, il vaut mieux pratiquer ainsi pour éviter d'installer/désinstaller trop souvent dans la palette.
Pourrais-tu nous faire un dessin de ce que tu souhaites obtenir à l'écran ? (un petit dessin vaut mieux qu'un long discours)
May Delphi be with you
cs_Delphiprog
Messages postés4297Date d'inscriptionsamedi 19 janvier 2002StatutMembreDernière intervention 9 janvier 201332 25 nov. 2003 à 21:44
Apparemment, il y a un problème de logique ou de bon sens. Appelle ça comme tu voudras.
Visiblement, on devrait créer 3* 5 soit 15 panels.
Or, tu déclares des tableaux de panels de 4 * 16 = 64 panels !
Reprend ton code à zéro en t'aidant de l'image ci-dessus (la bonne, évidemment :-p ).
A l'exécution, la partie basse du tableau est coupée du fait de la hauteur du panel "parent", ce qui peut laisser penser que tout est correct.
May Delphi be with you
yoghisan
Messages postés204Date d'inscriptionsamedi 10 mai 2003StatutMembreDernière intervention 2 juin 20051 25 nov. 2003 à 22:10
Oui, je pourrais faire ca et je vais essayer le faire. Le probleme, c'est que je ne maitrise pas bien la création et surtout la destruction de composant (j'ai deja eu des pbs a cause de ca).
Mais je m'explique quand meme sur mes intentions :
Je crée au début tous les panels que l'on peut me demander, c'est a dire, 4*16+4*16 et ensuite je joue sur la propriété visible pour masquer les panels momentannéement inutiles. Et c'est la que ca bugge, ca ne veut pas se rendre invisible. Je pense tout simplement que l'on ne peut pas en mode construction rendre des composants invisibles sur un composant créé.
La solution, j'en ai deja trouvé une mais qui est une "ruse" parce que je n'arrive pas a raison ce probleme. Je voulais juste savoir pourquoi ca ca ne marche pas...
J'ai pas de reponse, c'est pas grave... Mais maintenant, il est temps que j'arre de t'embeter...
cs_Delphiprog
Messages postés4297Date d'inscriptionsamedi 19 janvier 2002StatutMembreDernière intervention 9 janvier 201332 25 nov. 2003 à 22:52
OK.
Ca change beaucoup de choses.
En réalité, tu derais :
1/- construire un seul type de composant tel qu'il figure sur ta première image.
2/-Déclare un type énuméré représentant le type d'opération logique :
TOperationLogique = (olOR, olXOR, olAND, olNOT);
3/- Déclarer une propriété du type TOperationLogique
4- Traiter les clics dans l'évènement OnClic des panels de réponse, selon le type d'opération logique sélectionné dans la propriété citée ci-dessus.
Tel que tu le fais jusqu'ici, tu mélanges le traitement et le dessin du composant, obligeant à faire de savantes et hasardeuses manipulations.
Il n'y a qu'un cas pour lequel celà peut proposer un problème : c'est lorsque l'on a affaire à un opérateur unaire.
Mais comme il y a toujours une solution, alors, dans ce cas là, tu peux masquer les panels d'une des colonnes en forçant une opération de dessin du composant.
Avec toutes ces idées, celà ne devrait plus poser de problème(s). :approve)
May Delphi be with you