msr Posted August 16, 2009 at 09:37 PM Report #283527 Posted August 16, 2009 at 09:37 PM 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 🙂 COMPONENT ORGANIZER easily organize your electronic parts and application notes
bruno1234 Posted August 16, 2009 at 11:33 PM Report #283542 Posted August 16, 2009 at 11:33 PM 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); } Matraquilhos para Android. Gratuito na Play Store. https://play.google.com/store/apps/details?id=pt.bca.matraquilhos
msr Posted August 23, 2009 at 10:11 PM Author Report #284287 Posted August 23, 2009 at 10:11 PM 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á! COMPONENT ORGANIZER easily organize your electronic parts and application notes
bruno1234 Posted August 23, 2009 at 10:49 PM Report #284289 Posted August 23, 2009 at 10:49 PM 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. Matraquilhos para Android. Gratuito na Play Store. https://play.google.com/store/apps/details?id=pt.bca.matraquilhos
msr Posted August 24, 2009 at 02:29 PM Author Report #284342 Posted August 24, 2009 at 02:29 PM 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 COMPONENT ORGANIZER easily organize your electronic parts and application notes
bruno1234 Posted August 24, 2009 at 02:44 PM Report #284343 Posted August 24, 2009 at 02:44 PM 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. Matraquilhos para Android. Gratuito na Play Store. https://play.google.com/store/apps/details?id=pt.bca.matraquilhos
msr Posted August 24, 2009 at 02:54 PM Author Report #284344 Posted August 24, 2009 at 02:54 PM Hmm entao isso reflecte a minha nabice em C# 😁 De que forma o poderei fazer? Com que classes? Os unicos ficheiros que manipulei (escrita e leitura) até agora foram XML. COMPONENT ORGANIZER easily organize your electronic parts and application notes
bruno1234 Posted August 24, 2009 at 03:22 PM Report #284345 Posted August 24, 2009 at 03:22 PM 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. Matraquilhos para Android. Gratuito na Play Store. https://play.google.com/store/apps/details?id=pt.bca.matraquilhos
msr Posted August 31, 2009 at 03:55 PM Author Report #285186 Posted August 31, 2009 at 03:55 PM 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 👍 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. COMPONENT ORGANIZER easily organize your electronic parts and application notes
bruno1234 Posted August 31, 2009 at 07:01 PM Report #285208 Posted August 31, 2009 at 07:01 PM 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. Matraquilhos para Android. Gratuito na Play Store. https://play.google.com/store/apps/details?id=pt.bca.matraquilhos
msr Posted September 4, 2009 at 06:08 PM Author Report #285663 Posted September 4, 2009 at 06:08 PM 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 COMPONENT ORGANIZER easily organize your electronic parts and application notes
bruno1234 Posted September 4, 2009 at 06:34 PM Report #285666 Posted September 4, 2009 at 06:34 PM 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. Matraquilhos para Android. Gratuito na Play Store. https://play.google.com/store/apps/details?id=pt.bca.matraquilhos
renafi Posted September 4, 2009 at 06:44 PM Report #285671 Posted September 4, 2009 at 06:44 PM 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 Oracle Certified Professional - AdministraçãoOracle Certified Professional - Pl/sqlMCPD - Microsoft Certified Professional DeveloperMCTS - Microsoft Certified Technology Specialist
msr Posted September 5, 2009 at 12:57 AM Author Report #285725 Posted September 5, 2009 at 12:57 AM 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 COMPONENT ORGANIZER easily organize your electronic parts and application notes
bruno1234 Posted September 5, 2009 at 01:17 AM Report #285726 Posted September 5, 2009 at 01:17 AM 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. Matraquilhos para Android. Gratuito na Play Store. https://play.google.com/store/apps/details?id=pt.bca.matraquilhos
msr Posted September 5, 2009 at 01:44 AM Author Report #285729 Posted September 5, 2009 at 01:44 AM 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: (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. COMPONENT ORGANIZER easily organize your electronic parts and application notes
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now