1. Este site usa cookies. Ao continuar a usar este site está a concordar com o nosso uso de cookies. Saber Mais.

manipulação simbólica em C#

Discussão em 'Programação' iniciada por fap, 8 de Julho de 2004. (Respostas: 5; Visualizações: 1937)

  1. fap

    fap Power Member

    Olá,

    alguém sabe de métodos/classes que permitam facilmente a manipulação simbólica em C#? Queria fazer qualquer coisa como:
    -desenhar uma circunferência no ecrã e esta circunferência instanciar-me uma classe X
    -manipular a circunferência e isso reflectir-se na instância de X...tipo se fizer double click na circunferência ela mostra-me os atributos e os seus valores da instância da classe X

    infelizmente não dá para estender a classe Graphic pois esta é sealed :(

    preciso mesmo de arranjar uma maneira de relacionar a zona de ecrã (ou o objecto Graphic lá desenhado) com instâncias de classes...

    ideias eram bem vindas :)
    obrigado
     
  2. NoMercy

    NoMercy Power Member

    se o que queres é manipular o formato/cor etc de um objecto porque é que não derivas do objecto pertendido num componente e depois fazes override ao OnPaint e alteras o formato?
    Tambem podes alterar (redesenhar), um form por exemplo, com System.Drawing.Drawing2D.GraphicsPath() no paint do form.
    Se é isto que queres diz, pq posso postar código para ver se ajuda.
     
  3. fap

    fap Power Member

    boas...o problema é que não é isso que quero...por mim posso desenhar um objecto qualquer e deixá-lo ficar como está...o que quero é mesmo fazer manipulação simbólica...deixa-me ver se consigo explicar com um exº:

    imagina que tens uma consola que te pede dois números e te devolve a soma...

    agora o que quero fazer (não com este exemplo, mas pode ser explicado assim) era desenhar duas circunferências (que representariam duas instâncias da classe Numero por exº), clicar em cada uma delas e modificar o campo "valor"...agora criava uma 3a circunferência, unia aquelas duas com rectas à 3a, e o campo "valor" da 3ª dava a soma das outras duas? tás a perceber +/- o que quero dizer com manipulação simbólica?
     
  4. NoMercy

    NoMercy Power Member

    o que queres é com um objecto simbólico qualquer atribuir-lhe um valor numérico e depois somar os valores e apresentar num novo objecto o valor, por exemplo, certo?? (este português!! está dificil de se entender :007: )

    experimenta este código para ver se é mais ou menos o que queres.
    Se for, depois é só tomares isto como um exemplo e usares a imaginação para o que quiseres.
    O código está "montado" num form só por ser mais fácil/rápido de fazer o exemplo.
    Criar um novo circulo dando um valor e carregando no botão
    cada vez que deres um click num circulo ele soma o seu valor á variavel iValorDaSoma e cria um novo circulo (a vermelho) com o resultado da soma.

    Código:
    using System;
    using System.Drawing;
    using System.Collections;
    using System.ComponentModel;
    using System.Windows.Forms;
    using System.Data;
    
    namespace ManipulacaoSimbolica
    {
    	/// <summary>
    	/// Summary description for Form1.
    	/// </summary>
    	public class Form1 : System.Windows.Forms.Form
    	{
    		private System.Windows.Forms.TextBox txtValor;
    		private System.Windows.Forms.Label label1;
    		private System.Windows.Forms.Button btAtribuirValor;
    
    		//private System.Windows.Forms.Button btCirculo;
    		private int iTop = 0;
    		private int iLeft = 0;
    		private int iValorDaSoma = 0;
    
    
    		/// <summary>
    		/// Required designer variable.
    		/// </summary>
    		private System.ComponentModel.Container components = null;
    
    		public Form1()
    		{
    			//
    			// Required for Windows Form Designer support
    			//
    			InitializeComponent();
    
    			//
    			// TODO: Add any constructor code after InitializeComponent call
    			//
    		}
    
    		/// <summary>
    		/// Clean up any resources being used.
    		/// </summary>
    		protected override void Dispose( bool disposing )
    		{
    			if( disposing )
    			{
    				if (components != null) 
    				{
    					components.Dispose();
    				}
    			}
    			base.Dispose( disposing );
    		}
    
    		#region Windows Form Designer generated code
    		/// <summary>
    		/// Required method for Designer support - do not modify
    		/// the contents of this method with the code editor.
    		/// </summary>
    		private void InitializeComponent()
    		{
    			this.txtValor = new System.Windows.Forms.TextBox();
    			this.label1 = new System.Windows.Forms.Label();
    			this.btAtribuirValor = new System.Windows.Forms.Button();
    			this.SuspendLayout();
    			// 
    			// txtValor
    			// 
    			this.txtValor.Location = new System.Drawing.Point(40, 16);
    			this.txtValor.Name = "txtValor";
    			this.txtValor.TabIndex = 0;
    			this.txtValor.Text = "";
    			// 
    			// label1
    			// 
    			this.label1.Location = new System.Drawing.Point(8, 16);
    			this.label1.Name = "label1";
    			this.label1.Size = new System.Drawing.Size(32, 16);
    			this.label1.TabIndex = 1;
    			this.label1.Text = "Valor";
    			// 
    			// btAtribuirValor
    			// 
    			this.btAtribuirValor.Location = new System.Drawing.Point(152, 16);
    			this.btAtribuirValor.Name = "btAtribuirValor";
    			this.btAtribuirValor.Size = new System.Drawing.Size(144, 23);
    			this.btAtribuirValor.TabIndex = 2;
    			this.btAtribuirValor.Text = "Criar Circulo com o valor";
    			this.btAtribuirValor.Click += new System.EventHandler(this.btAtribuirValor_Click);
    			// 
    			// Form1
    			// 
    			this.AutoScaleBaseSize = new System.Drawing.Size(5, 13);
    			this.ClientSize = new System.Drawing.Size(376, 347);
    			this.Controls.Add(this.btAtribuirValor);
    			this.Controls.Add(this.label1);
    			this.Controls.Add(this.txtValor);
    			this.Name = "Form1";
    			this.Text = "Form1";
    			this.ResumeLayout(false);
    
    		}
    		#endregion
    
    		/// <summary>
    		/// The main entry point for the application.
    		/// </summary>
    		[STAThread]
    		static void Main() 
    		{
    			Application.Run(new Form1());
    		}
    
    		private void btAtribuirValor_Click(object sender, System.EventArgs e)
    		{
    			if (txtValor.Text != "")
    			{
    				//instanciar novo circulo com o valor em txtValor.
    				System.Windows.Forms.Button btCirculo = new Button();
    				//Contando que o valor inserido em txtValor é um numérico inteiro.
    				btCirculo.Tag = txtValor.Text;
    				btCirculo.Text = txtValor.Text;
    				btCirculo.Click +=new EventHandler(btCirculo_Click);
    				btCirculo.Paint +=new PaintEventHandler(btCirculo_Paint);
    				btCirculo.Top = 50+iTop;
    				btCirculo.Left = 50+iLeft;
    				this.Controls.Add(btCirculo);
    				iTop++;
    				iLeft +=35;
    			}
    			else
    			{
    				MessageBox.Show("Insira um valor");
    			}
    		}
    
    		private void btCirculo_Click(object sender, EventArgs e)
    		{
    			iValorDaSoma += int.Parse(((Button)sender).Tag.ToString());
    			//MessageBox.Show(iValorDaSoma.ToString());
    			//Criar novo circulo com o resultado da soma;
    			System.Windows.Forms.Button btResultado = new Button();
    			btResultado.Tag = iValorDaSoma.ToString();
    			btResultado.Text = iValorDaSoma.ToString();
    			btResultado.Click +=new EventHandler(btResultado_Click);
    			btResultado.Paint +=new PaintEventHandler(btResultado_Paint);
    			btResultado.Top = 50+iTop;
    			btResultado.Left = 50+iLeft;
    			this.Controls.Add(btResultado);
    			iTop++;
    			iLeft +=35;
    		}
    
    		private void btCirculo_Paint(object sender, PaintEventArgs e)
    		{
    			System.Drawing.Drawing2D.GraphicsPath myGraphicsPath  = new
    				System.Drawing.Drawing2D.GraphicsPath();
    			myGraphicsPath.AddEllipse(new Rectangle(0, 0, 30, 30));
    			((Button)sender).BackColor = Color.Chartreuse;
    			((Button)sender).Size = new System.Drawing.Size(35, 35);
    			((Button)sender).Region = new Region(myGraphicsPath);
    		}
    
    		private void btResultado_Click(object sender, EventArgs e)
    		{
    			MessageBox.Show(((Button)sender).Tag.ToString());
    		}
    
    		private void btResultado_Paint(object sender, PaintEventArgs e)
    		{
    			System.Drawing.Drawing2D.GraphicsPath myGraphicsPath  = new
    				System.Drawing.Drawing2D.GraphicsPath();
    			myGraphicsPath.AddEllipse(new Rectangle(0, 0, 30, 30));
    			((Button)sender).BackColor = Color.Red;
    			((Button)sender).Size = new System.Drawing.Size(35, 35);
    			((Button)sender).Region = new Region(myGraphicsPath);
    		}
    	}
    }
    
     
  5. fap

    fap Power Member

    bom não percebi bem o que quiseste dizer mas acho que a resposta é não :D

    imagina que tinha
    Código:
    public class GraficoMeu {
    
        private Graphic graf;
        private string atributo1;
        private int atributo2;
    
        (...)
    
    
    }
    
    isto era o idela...com o graf desenhava por exº um circulo no ecran...ao clicar no circulo iria ver que instância de GraficoMeu é que tinha AQUELE círculo específico como atributo graf...eu não sei se me estou a explicar bem :(

    de qualquer modo depois dos exames vou tentar o teu código a ver se dá para ajudar qualquer coisa
    thanks
     
  6. KumbaYa

    KumbaYa Power Member

    O que me parece que estás a precisar é de Reflection. Que não sei exactamente como se faz em c# mas ai o sr. google pode dar uma ajuda :)
    De maneira a poderes invocar uma classe que à partida não conheces ou metodos nas mesmas condições... Seria esta a abordagem.. penso eu de que :)
     

Partilhar esta Página