Jump to content
noobre

Converter Textbox para string num ciclo For

Recommended Posts

noobre

Estou a criar um jogo tipo Scrabble e estou a ter um pequeno erro.

b0ac5e51ee3a15c5dcab92c91f84f115.png

Basicamente esse é a verificação ao carregar no botão  de finalizar.

Vai percorrer toda a matriz e todas as textbox's criadas que são 225.

e6f814482437a34be87b1732e212b3d0.png

 

Se eu puser no código assim: 

44aa2e2745e751005f03a236c346731c.png

 

Assim vai dar porque a textbox já tem o valor inserido. Basicamente não me está a converter as textbox's que eu ponho as letras em string.

Alguém me pode ajudar ? para mais informações é só dizer. Obrigado a quem viu e não ignorou! 

Share this post


Link to post
Share on other sites
apocsantos

Boa tarde,

Ok, algumas questões, cada quadricula é uma textbox ? Se forem, como sabes o nome da textbox ?

Precisava de perceber o que perguntei acima, para poder ajudar melhor. Se cada quadricula for uma textbox, e precisas de validar uma palavra (conjunto de quadriculas), fazes uma string temporária, concatenas as strings (de cada quadricula), e depois comparas.

Cordiais cumprimentos,

Apocsantos


"A paciência é uma das coisas que se aprendeu na era do 48k" O respeito é como a escrita de código, uma vez perdido, dificilmente se retoma o habito"

Share this post


Link to post
Share on other sites
noobre

https://pastebin.com/wz4GdBpV

 

Esse é o código do projecto. Basicamente associei uma textbox a uma celula da matriz. Não sei se é assim que devia ter feito porque creio que existe um ciclo For que me ajuda a fazer isso creio eu. Qual é a tua opinião ?

Share this post


Link to post
Share on other sites
apocsantos

Boa noite,

Ok, vais ter de enumerar todas as textbox's para depois poderes iterar sobre elas.

Primeiro uma função para as enumerar:

public static IEnumerable<TControl> GetChildControls<TControl>(this Control control) where TControl : Control
{
    var children = (control.Controls != null) ? control.Controls.OfType<TControl>() : Enumerable.Empty<TControl>();
    return children.SelectMany(c => GetChildControls<TControl>(c)).Concat(children);
}

Depois, chamas a função e seleccionas apenas os objectos do tipo textbox:

int palavrasCorrectas = 0;

string palavraTemp ="";
var todasTextBoxes = this.GetChildControls<TextBox>();
foreach (TextBox tb in todasTextBoxes)
{
    palavratemp = palavratemp +  tb.text.toString(); //começa a compor a palavra inteira, com base em cada textbox pela ordem em que foram criadas (numero da textbox).
  
  //agora aqui colocas o código para comparar cada palavra e armazenas o valor por cada palavra correcta, sendo que sabes quantas palavras tem o tabuleiro, logo, só precisas de saber quantas palavras o utilizador acertou e se o numero for igual, então venceu
}
if (palavrasCorrectas == totalPalavras)
{
	console.writeln("Ganhou");
}
Else
{
	console.writeln("Good luck! ;)");
}

Cordiais cumprimentos,

Apocsantos

 

 


"A paciência é uma das coisas que se aprendeu na era do 48k" O respeito é como a escrita de código, uma vez perdido, dificilmente se retoma o habito"

Share this post


Link to post
Share on other sites
noobre

Não consegui perceber muito bem esse código ou se calhar não me expliquei bem.
Eu basicamente criei 225 TextBox's, e criei uma matriz de 15 por 15 que cada posição da matriz vai corresponder a uma Textbox. Tipo:

TextBox2.Text = Tabuleiro[0, 2];

Inicialmente queria fazer 2 dificuldades que a 1 dificuldade as primeiras letras das palavras eram dispostas no gráfico e que o jogador teria que completar a palavra. 
Eu na função matriz(); por ordem numérica já as textbox's devidamente á posição da matriz. Agora na função finalizar queria que verificasse se realmente a letra "L" por exemplo está na posição Tabuleiro[4, 6] e para isso tenho que converter todas as textbox's de CHAR para STRING. Para no fim fazer:

 if (Tabuleiro[4, 6] == 'L') 

e não

if (textBox67.Text == 'L')

Porque acredito que se fizer desta maneira é mais fácil para descobrir se realmente naquela posição da matriz se encontra a letra que eu quero e para evitar de estar constantemente a ir ver qual é que é a textbox que corresponde á posição que quero verificar.

Obrigado desde mais pela a ajuda! Cumprimentos

Edited by noobre

Share this post


Link to post
Share on other sites
apocsantos

Boa tarde,

Não tinha entendido bem a questão. Pensei que estavas a tentar validar as palavras completas e não "letra a letra"

Ora bem a função que permite aceder a cada textbox, é a mesma, muda o código no seu interior, para converter cada o valor de cada textbox.

string textboxLetra ="";
var todasTextBoxes = this.GetChildControls<TextBox>();
foreach (TextBox tb in todasTextBoxes)
{
   textboxLetra = tb.toString(); //basciamente dentro deste loop, são percorridas todas as textbox e o seu conteudo convertido para string e armazenado na variável textboxLetra.
}

Cordiais cumprimentos,

Apocsantos


"A paciência é uma das coisas que se aprendeu na era do 48k" O respeito é como a escrita de código, uma vez perdido, dificilmente se retoma o habito"

Share this post


Link to post
Share on other sites
noobre

Boa tarde, perdoa-me a ignorância mas c# ainda é um pouco novo para mim e as aulas foram poucas. 

Eu pus o código assim: 

4edd26ef8cef225bb146a7dc567e5e04.png

E dá erro onde está visivel e aqui:

296dc46bd3a6845181ab8922deee2083.png

 

A lista de erros:
 

Error    CS1106    Extension method must be defined in a non-generic static class  
Error    CS7036    There is no argument given that corresponds to the required formal parameter 'control' of 'Form1.GetChildControls<TControl>(Control)'  

 

Share this post


Link to post
Share on other sites
apocsantos

Boa tarde,

Primeiro vê se tens o using correcto.

u

using System.Windows.Forms;
using System.Collections;

Depois, creio que seja um problema de scope.

Verifica primeiro os usings.

Cordiais cumprimentos,

Apocantos


"A paciência é uma das coisas que se aprendeu na era do 48k" O respeito é como a escrita de código, uma vez perdido, dificilmente se retoma o habito"

Share this post


Link to post
Share on other sites
noobre

Tenho tudo bem, Apocsantos.

Este erro:

Error    CS1106    Extension method must be defined in a non-generic static class  

Desaparece quando apago a função que me disse á bocado para introduzir:

public static IEnumerable<TControl> GetChildControls<TControl>(this Control control) where TControl : Control
{
    var children = (control.Controls != null) ? control.Controls.OfType<TControl>() : Enumerable.Empty<TControl>();
    return children.SelectMany(c => GetChildControls<TControl>(c)).Concat(children);
}

 

Eu experimentei apagar e de facto desaparece o erro mas continuo a ficar com o erro na função em baixo: 

de4fccd2edf82c14d8616a977514d6d5.png

 

O que me sugere que faça aqui ? Liste aqui todas as textbox's da 1 á 225 ?

Share this post


Link to post
Share on other sites
vikcch

Porque não crias logo um array de textbox's??

Depois quando quiseres te referenciar uma textbox é só indicares as coordenadas....

ex: é base zero... a primeira casa é [0,0] como tens na imagem...


 

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        TextBox[,] txts = new TextBox[15, 15];

        public Form1()
        {
            InitializeComponent();

            for (int y = 0; y < 15; y++)
            {
                for (int x = 0; x < 15; x++)
                {
                    TextBox txt = new TextBox();
                    txt.Left = x * 20;
                    txt.Top = y * 20;
                    txt.Width = 20;
                    this.Controls.Add(txt);

                    txts[x, y] = txt;
                }
            }
            txts[3, 6].Text = "E";
            txts[4, 6].Text = "L";
        }

        private void button1_Click(object sender, EventArgs e)
        {
            if (txts[3, 6].Text == "E" && txts[4, 6].Text == "L")
            {
                MessageBox.Show("ok");
            }
            else
            {
                MessageBox.Show("not ok");
            }
        }
    }
}

 

Share this post


Link to post
Share on other sites
noobre

@vikcch, obrigado. Ontem na aula um amigo meu também me falou em criar um array de textbox's mas como já tinha parte o trabalho feito decidi não avançar mas agora reparei que o fazendo torna o esquema muito mais simples e muito mais fácil de entender. Obrigado foi uma grande ajuda! 

Obrigado ao Apocsantos pela disponibilidade também! 

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.