Gnrtuga Posted March 5, 2018 at 08:34 AM Report #609582 Posted March 5, 2018 at 08:34 AM Olá pessoal, eu sou daqueles "programadores" que vão aprendendo sozinhos (livros, P@P e experiências) e por isso às vezes tenho dúvidas que acho que devem ser básicas (como esta) para quem percebe disto. Um dos meus grandes males é programar tudo na Main Page, o que por vezes cria um código tão desorganizado que nem eu sei onde ando. No código que vou deixar em baixo tenho alguns métodos (Leitor_Artigo, Art1) que gostaria de colocar noutro sitio (numa classe, acho eu) de forma a ficar mais organizado, porque por exemplo os métodos dos artigos (Art1) não têm grande coisa dentro deles, mas se multiplicarmos essa meia dúzia de linhas por + de 300 artigos fico com muitas linhas e com muita dificuldade em encontrar seja o que for... Tentei criar uma classe e colar lá os métodos, mas apareceram logo erros e eu fiquei sem saber o que fazer.. using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Runtime.InteropServices.WindowsRuntime; using Windows.Foundation; using Windows.Foundation.Collections; using Windows.UI.Xaml; using Windows.UI.Xaml.Controls; using Windows.UI.Xaml.Controls.Primitives; using Windows.UI.Xaml.Data; using Windows.UI.Xaml.Input; using Windows.UI.Xaml.Media; using Windows.UI.Xaml.Navigation; using Windows.Storage; //*file access using Windows.UI.Popups; //*Messagebox using Windows.Storage.Streams; using Windows.UI.Xaml.Documents; //adicionei este por causa do RichTextBlock using System.Text; // este foi adicionado por causa do encoding //</ add namespaces > // O modelo de item de Página em Branco está documentado em https://go.microsoft.com/fwlink/?LinkId=402352&clcid=0x416 namespace CodigoPenal { /// <summary> /// Uma página vazia que pode ser usada isoladamente ou navegada dentro de um Quadro. /// </summary> public sealed partial class MainPage : Page { public MainPage() { this.InitializeComponent(); } private void BotaoBloco_Click(object sender, RoutedEventArgs e) { Limpa(); Art2(); } private void streamreader_Click(object sender, RoutedEventArgs e) { Limpa(); Art1(); } //Este Leitor vai ler os artigos e manda o texto para blocotexto public async void Leitor_Artigos(string Artigo) { StorageFile OpenedStorageFile = await StorageFile.GetFileFromApplicationUriAsync(new Uri(this.BaseUri, Artigo)); if (OpenedStorageFile != null) { try { IRandomAccessStream randomAccStream = await OpenedStorageFile.OpenAsync(FileAccessMode.Read); var st = randomAccStream.AsStream(); StreamReader sr = new StreamReader(st, Encoding.UTF7); string s = await sr.ReadToEndAsync(); Paragraph paragraph = new Paragraph(); Run run = new Run(); run.Text = s; paragraph.Inlines.Add(run); blocotexto.Blocks.Add(paragraph); } catch (Exception ex) { MessageDialog md = new MessageDialog(ex.Message); await md.ShowAsync(); } } } // Este Leitor vai ler a Jurisprudência e enviar para juri public async void Leitor_Juri(string ArtigoJuri) { StorageFile OpenedStorageFile = await StorageFile.GetFileFromApplicationUriAsync(new Uri(this.BaseUri, ArtigoJuri)); if (OpenedStorageFile != null) { try { IRandomAccessStream randomAccStream = await OpenedStorageFile.OpenAsync(FileAccessMode.Read); var st = randomAccStream.AsStream(); StreamReader sr = new StreamReader(st, Encoding.UTF7); string s = await sr.ReadToEndAsync(); Paragraph paragraph = new Paragraph(); //Faz o mesmo que o metedo Leitor_Artigos, mas tem a parte do Run simplificada Run run = new Run { Text = s }; paragraph.Inlines.Add(run); juri.Blocks.Add(paragraph); } catch (Exception ex) { MessageDialog md = new MessageDialog(ex.Message); await md.ShowAsync(); } } } //método para limpar as caixas de texto public void Limpa() { titulo.Text = ""; blocotexto.Blocks.Clear(); Jurisprudencia.Text = ""; juri.Blocks.Clear(); } //métodos que vão ser chamados pelos botões public void Intro() { string Artigo = "Livro1/Introducao.txt"; Leitor_Artigos(Artigo); titulo.Text = "Introdução"; } public void Art1() { string Artigo = "Livro1/Artigo1_PrincipioLegalidade.txt"; Leitor_Artigos(Artigo); NumeroArtigo.Text = "Artigo 1º"; titulo.Text = "PRINCIPÍO DA LEGALIDADE"; } public void Art2() { string Artigo = "Livro1/Artigo2_AplicacaoTempo.txt"; NumeroArtigo.Text = "Artigo 2º"; titulo.Text ="APLICAÇÃO NO TEMPO"; Leitor_Artigos(Artigo); Jurisprudencia.Text = "Jurisprudência"; String ArtigoJuri = "Livro1/Artigo2_Juris.txt"; Leitor_Juri(ArtigoJuri); } } } Como é que eu consigo organizar isto? Obrigado Férias! Estou por aqui: http://maps.google.p...001549&t=h&z=20 (a bulir claro está!) Nunca mais é verão outra vez.. :)
Markkex Posted March 5, 2018 at 04:10 PM Report #609597 Posted March 5, 2018 at 04:10 PM Podes criar uma library onde podes por o codigo menos importante. Crias o metodo nessa library, escreves o codigo que precisas nessa library e no codigo principal é só invocares o metodo. Assim deixas a pagina principal só com os metodos e na library fica todo o codigo que necessitas de escrever para acontecer o que queres que aconteça. Tem um metodo diferente do que estás habituado mas vais ver que vai-te ajudar a organizar melhor o codigo. Dá uma olhada aqui (https://docs.microsoft.com/en-us/dotnet/core/tutorials/library-with-visual-studio) ou entao procura tutoriais na net é sempre mais fácil. Espero que tenha ajudado!
Gnrtuga Posted March 5, 2018 at 09:56 PM Author Report #609615 Posted March 5, 2018 at 09:56 PM Markkex, obrigado pela ajuda mas mesmo assim estou confuso... Para usar por exemplo este método: public void Limpa() { titulo.Text = ""; blocotexto.Blocks.Clear(); Jurisprudencia.Text = ""; juri.Blocks.Clear(); } Tenho mesmo que criar um Class Library? Eu não quero usar noutra solução... É que estes campos são campos do XAML (não sei se existe outra definição) , e o que quero é apenas apagar o conteúdo dos mesmos.. Mesmo colocando dentro de uma classe no mesmo projecto, ele queixa-se de que os campos não existem no contexto actual... Numa Class Library (o mesmo método) queixa-se da mesma coisa... using System; namespace Ajudas { public class BibliotecaAjuda { public void Limpa() { titulo.Text = ""; blocotexto.Blocks.Clear(); Jurisprudencia.Text = ""; juri.Blocks.Clear(); } } } Falta-me algum using? Tou completamente perdido... 😞 Férias! Estou por aqui: http://maps.google.p...001549&t=h&z=20 (a bulir claro está!) Nunca mais é verão outra vez.. :)
coxosclassic Posted March 6, 2018 at 11:48 AM Report #609624 Posted March 6, 2018 at 11:48 AM Boas, Tenta implementar MVC (por ex.) no teu projeto. Desenvolver á volta de um padrão pode ajudar muito na organização do projeto. cumps. 1 Report Cumps, cc
Gnrtuga Posted March 6, 2018 at 07:05 PM Author Report #609636 Posted March 6, 2018 at 07:05 PM Obrigado coxosclassic, mas isso já é um nível acima, ainda estou na parte mais básica de organizar (tentar) por classes e módulos. Já tentei fazer o descrito no site recomendado pelo markkex (Standard Library), que penso que deve andar dentro do que eu estava a pensar, no entanto no meu visual studio não me aparece (ou não encontro) o passo 5 (Build Solution)., e o ficheiro que fica guardado (qualquercoisa.cs), não o consigo adicionar às referências do solution explorer... Deve ser básico, mas certamente devo estar a fazer algo mal. O site que me sugeriste, há de ser para ler (e tentar aplicar) mais tarde. De qualquer forma, obrigado pela ajuda. Férias! Estou por aqui: http://maps.google.p...001549&t=h&z=20 (a bulir claro está!) Nunca mais é verão outra vez.. :)
RicardoCosta Posted March 10, 2018 at 09:15 AM Report #609703 Posted March 10, 2018 at 09:15 AM Boas, O teu método Limpa não funciona porque tu tens os botões no form, Ou seja, a classe que estas a tentar usar não sabe o que são esses botões. Se queres realmente organizar código pensa antes assim, tenta separar negócio da apresentação (o form). O método Limpa por exemplo, é uma funcionalidade do form ou seja, nada tem a ver com o negócio. Para este caso podes deixar o Limpa no Main. Agora por exemplo para os métodos Leitor_Artigos e Leitor_Juri, a parte em que estas a ler o ficheiro podes meter à parte e assim reutilizar o código. Crias por exemplo uma classe Leitor com o método Ler que recebe um url e retorna string. namespace Ajudas { public class Leitor { private readonly Uri path; public Leitor(Uri path) { this.path = path; } public async string Ler() { StorageFile OpenedStorageFile = await StorageFile.GetFileFromApplicationUriAsync(path); if (OpenedStorageFile == null) throw new ArgumentNullException("Path is null!"); IRandomAccessStream randomAccStream = await OpenedStorageFile.OpenAsync(FileAccessMode.Read); var st = randomAccStream.AsStream(); StreamReader sr = new StreamReader(st, Encoding.UTF7); return await sr.ReadToEndAsync(); } } } E nos teus métodos Leitor_Artigos e Leitor_Juri podes usar assim: var path = new Uri(this.BaseUri, ArtigoJuri); var leitor = new Leitor(path); var texto = leitor.Ler(); Desta forma, sempre que quiseres ler ficheiros só tens de chamar a classe leitor. Poderás ainda estender a funcionalidade e criar o método Escrever(string texto) para quando queres escrever para um ficheiro. Cumprimentos
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