manipulação simbólica em C#

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
 
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.
 
NoMercy disse:
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?

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?
 
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);
		}
	}
}
 
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
 
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 :)
 
Back
Topo