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.
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.
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
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 :)