• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

msr

[WinForms] Varias duvidas

16 mensagens neste tópico

Olá,

Estou a fazer um pequeno programar para me introduzir ao Visual C# e neste momento tenho algumas dúvidas:

Como gravar um ficheiro xml na pasta root do executavel do programa? Ao iniciar o programa leio o xml existente a partir de XmlTextReader e ao fechar estou a usar XmlTextWriter.

A mesma questão se aplica em relação ao uso do XmlTextWriter.

Outra questão. Como posso salvaguardar as alterações feitas (isto é, escrever ficheiro xml) imediatamente antes do programa terminar (seja qual for a razão, ie, prepositadamente ou por alguma "exception")?

Há algum handler que me possa ajudar nesse aspecto ou já existe alguma função feita que me permita adicionar apenas o código?

Desde já muito obrigado por qualquer ajuda que possam dar :)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Para saberes qual é a directoria onde o teu executável está a correr podes fazer:

Environment.CurrentDirectory, q retorna uma string.

Assim abres a stream para usar o teu xml reader e writer nesta pasta com o respectivo ficheiro xml.

Quanto á 2ª pergunta, a ocorrencia de uma excepção não deve ser motivo para o programa terminar, tratas a excepção, e a execução do programa continua.

A gravação para ficheiro, depende de como quiseres fazer, podes fazer alteração a alteração, ter um botão gravar ou então gravar automaticamente qd o utilizador fecha a aplicação na cruz.

Caso escolhas a opção gravar qd fecha na cruz podes fazer override ao onclosing, assim:

protected override void OnClosing(CancelEventArgs e)
{
            // Codigo para gravar xml
            // ...

            base.OnClosing(e);
}

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Obrigado bruno, funcionou na perfeição!

Tenho mais uma dúvida. Como criar uma cópia de um ficheiro seleccionado pelo utilizador (algures no disco rigido) e grava-la numa pasta da directoria do programa?

Estou a usar o OpenFileDialog para o user escolher um ficheiro do disco rigido e depois queria que fosse criada uma copia para uma pasta na directoria do executavel do programador.

Já agora, se em vez de copiar ("copy to") quiser mover ("move to") qual é a diferença a nivel de codigo?

Obrigado desde já!

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

o .net tem a classe File que te permite fazer as operações q queres.

tens:

File.Copy(string source, string dest, bool overwrite)

File.Move(string source, string dest)

entre outros, podes usar os métodos desta classe para copiar e mover.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Olá,

Obrigado pela resposta.

Tentei usar esses métodos mas nao consegui. Tentei então usar a classe "FileInfo", o método "CopyTo" e o exemplo que aparece no MSDN.

O código que tenho é o seguinte:

            //copy datasheet to 'datasheets folder'
            current_path = @path_textbox.Text;
            filename = component_name_textbox.Text;
            new_path = @active_path + "\\datasheets\\" + filename + ".pdf";

            if (String.Compare(current_path, "") != 0)
            {
                try
                {
                    FileInfo fi1 = new FileInfo(current_path);
                    FileInfo fi2 = new FileInfo(new_path);
                    using(FileStream fs = fi1.Create()){}
                    fi2.Delete();
                    fi1.CopyTo(new_path);
                    /*FileInfo file = new FileInfo(current_path);
                    file.CopyTo(active_path + "\\datasheets\\" + file.Name);*/
                }
                catch(Exception ex)
                {
                    MessageBox.Show("Couldn't copy file to 'datasheets' folder. Datasheet wasn't saved.\n" + ex.Message,"",MessageBoxButtons.OK,MessageBoxIcon.Error);
                    new_path = "";
                }
            }

O codigo que está em comentario era o que tinha antes, mas tambem nao funcionou. Outra coisa que não percebo, que aparece no site MSDN, é esta linha "using(FileStream fs = fi1.Create()){}". O que é que está ali a fazer, já que "fs" nunca é utilizado?

O erro que tenho é ao abrir o PDF.  Fica sempre com 0bytes e ao abrir com o Foxit Reader obtenho o erro "format error: not a PDF or corrupted".

Deve estar a escapar qualquer coisa.

Se pudesses ajudar, agradecia!

Obrigado desde ja pelo teu tempo.

Edit:

Nao estava a ver a pagina do MSDN correcta data que a versão do .NET que tenho é a 3.5 SP1, mas de qualquer das maneiras a alteração que fiz foi esta:

                    if(File.Exists(new_path))
                        fi2.Delete();

e continuo sem conseguir abrir o pdf.

http://msdn.microsoft.com/en-us/library/f0e105zt.aspx

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Estás a criar um ficheiro e a copia-lo para outro lado, mas não estou a ver onde estás a acrescentar o conteudo do pdf.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Hmm entao isso reflecte a minha nabice em C# :biggrin:

De que forma o poderei fazer? Com que classes?

Os unicos ficheiros que manipulei (escrita e leitura) até agora foram XML.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O .net só por si não tem nenhuma classe para gerar pdf.

Podes no entanto pesquisar por bibliotecas externas. Tens, por exemplo, o iTextSharp.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Talvez nao me tenha explicado bem. O que queria era pegar num pdf ja existente no disco e criar uma cópia do mesmo numa pasta que existe no directório em que o programa/executavel está a correr. Acabei por faze-lo com o "FileStream" read e write.

Se nao for muito chato, tenho mais algumas duvidas :thumbsup:

1) Eu estou a usar uma grelha (dataGridView). De que forma é que posso activar o "right click" ao clicar na grelha? A ideia é clicar com o botao direito do rato sobre uma das linhas da grelha e aparecer-me um "menuStrip" (nao sei se será esse mesmo o componente) com varias opções.

2) Como fazer com que a tecla ENTER fique activa em determinadas situações? Por exemplo no final do user preencher uma textBox poder premir a tecla ENTER fazendo com que um botão seja automaticamente premido.

3) Corri o programa no Vista (onde estou a fazer o código) e no XP e a aparência é completamente diferente. As alterações que faço no vista (por exemplo as cores da grelha) não se verificam no XP. Há alguma forma de controlar isso através de código? Por exemplo, sabendo em que SO (xp ou vista) está a correr, o programa aplicar o "xp style" ou o "vista style".

4) Ultima dúvida. Há alguma maneira simples de traçar gráficos em tempo real? Por exemplo, receber determinados dados pela porta série e apresenta-los no ecrã de forma contínua. (a parte da porta série não é problema)

Obrigado desde já por qualquer ajuda que possam dar.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

As 3 primeiras perguntas n te posso responder pq tinha q andar a explorar o código e agora n tenho tempo.

Mas qt á quarta podes resolver com o novo componente para windows forms (e tb asp .net) q é o mschart.

O MsChart é um componente q faz gráficos tipo excel, existem vários tópicos aqui no fórum sobre ele.

Para o ligar através da porta série talvez dê para fazer através de eventos, é uma questão de explorar, ou então através de um temporizador.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Para nao estar a criar outro topico com cada pergunta, vou continuar a usar este.

Aqui vai. Tenho 2 forms e gostava que uma variável fosse partilhada entre eles. Como em C# nao existem variáveis globais, como é que resolvo isso?

Tenho o codigo mais ou menos assim:

List<component> component_list;

Sendo que a classe "component" está declarada no código do form1 (form principal).

Já li sobre colocar um "static" algures ou usar uns "get" e "set" na classe, mas estou um bocado perdido.

Será que podiam dar uma ajuda?

Obrigado

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Se a classe é partilhada por mais q um form, não deve estar declarada num dos forms.

Deve estar declarada num sitio q seja comum e acessivel pelos 2 forms.

Há maneira de por isso a funcionar assim como tens, mas n é a melhor abordagem.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Se a classe é partilhada por mais q um form, não deve estar declarada num dos forms.

Deve estar declarada num sitio q seja comum e acessivel pelos 2 forms.

Há maneira de por isso a funcionar assim como tens, mas n é a melhor abordagem.

Exactamente. A classe deve estar criada num ficheiro à parte, cujas forms tenham acesso. A partir dai, disponibilizas as variáveis para ficarem acessíveis em ambas as forms

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

A partir dai, disponibilizas as variáveis para ficarem acessíveis em ambas as forms

A minha duvida reside precisamente aqui. Como faço com que uma variavel fique acessivel em ambas as forms? (a classe nao tem problema, mas onde defino as variaveis em questao?)

No fundo o que estou a tentar fazer é ter uma "pseudo-variavel global" que sei que não é a melhor abordagem. Sendo assim de que forma é que deveria proceder?

Edit: nao encontro grande informação na net sobre como resolver isto, se me conseguissem arranjar algum link ou coisa do genero em que pudesse ler qq coisa sobre isto seria igualmente util

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Organizar código e fazer uma solução consistente n é uma coisa q se aprende de um dia para o outro com um link na net. Aprende-se com experiencia e com a participação em vários projectos.

Provavelmente começas-te a fazer a aplicação c# pelos forms sem pensares primeiro nas bibliotecas com as regras e lógica da aplicação.

Essas coisas devem ser feitas em separado e por camadas, se tens variaveis q necessitam estar em 2 forms devem estar numa camada acima e não na mesma.

Podes começar por pensar na funcionalidade que queres q os teus forms tenham, e crias uma classe (ou uma class library caso seja complexo) com um conjunto de variaveis, métodos e regras que depois serão acedidos pelos forms.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Bom... aqui vai o meu ponto de situação.

Eu posso dizer que tenho alguma experiência a programar... mas em C! (em C o nivel acima seria um header, em que guardaria definições e variaveis globais)

Depois de C, li qualquer coisa sobre C++ pelo que tambem adquiri algumas noções que me ajudaram depois a "entrar de cabeça" no C#. Entrei de cabeça no C# precisamente porque, depois de experimentar o Visual C#, fiquei espantando com o facto de, sem ter lido nada de C# em concreto, consegui fazer umas aplicações catitas. A produtividade é brutal. Para quem vem de C pensa (ou pelo menos eu pesei): "isto já está tudo feito, é só utilizar".

Nunca tinha feito uma calculadora ou um programa que comunicasse por serial com um circuito electronico exterior e achei isso fascinante ;)

Vai daí tentei aventurar-me num programa mais util mas tambem mais complexo. A verdade é que tenho feito isto um bocado à pressa porque o tempo livre não é muito, e apesar do código ter sido feito à martelada, a coisa está a funcionar e tenho aprendido alguma coisa.

Neste momento tenho o programa a funcionar mas uso apenas 1 form. A ideia a partir de agora seria aumentar os forms no sentido de aumentar a propria funcionalidade do programa. Mas tou a ver que neste momento já começam a ser necessários alguns conhecimentos que não tenho e que fazem falta.

O programa em questão é este:

(printscreen) http://i195.photobucket.com/albums/z259/Pongidae/p1.png

(download) http://cidadao.uni.cc/ComponentOrganizer/ (entretanto ja fiz algumas alterações, mas é mais ou menos isto)

É um progama util para quem gosta de electrónica. Serve para listar componentes que tenhamos por casa e anexar-lhes a datasheet para que seja de facil consulta.

Entretanto encomendei um livro de C# já no sentido de ver se aprendo mais qualquer coisa disto eheh

De qualquer das formas, obrigado pela vossa ajuda! Tem sido muito útil.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora