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

Nazgulled

Sugestões para solucionar este problema de programação

20 mensagens neste tópico

Decidi colocar este tópico aqui e não na respectiva secção da linguagem que vou usar para o problema (C#), porque gostava de obter opiniões das mais diversas pessoas e não só daquelas que vêem os tópicos na secção C#. Porque isto a mim parece-me um problema que pode ser resolvido por qualquer pessoa e não interessa a linguagem. Já agora, isto está relacionado com o meu FireNotes...

Imaginem uma aplicação com uma caixa de texto e dois botões. Um que carrega a nota anterior numa lista e outra que carrega a próxima. As notas que existme estão numa lista, como já disse, e são carregadas do disco quando necessárias, até aqui tudo bem.

Suponhamos agora que o utilizador modificou o texto da nota actual e esqueceu-se de o gravar e de seguida clica no botão para apresentar a próxima nota.

Bem, o que eu preciso é de algo simples e eficaz para avisar o utilizador que a nota actual (antes de passar a apresentar a próxima devido ao clique no respectivo botão) foi modificada e este esqueceu-se de a gravar.

Gostava de saber qual a melhor forma de fazer isto. A forma como tenho actual não gosto nada e está bué de confusa, talvez tenham sugestões melhores e a forma como tenho actualmente não interessa muito pelo que não vou revelar, para já... :P

Espera-se sugestões...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Um pequeno screen Y/N se quer guardar a nota ou não.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não existe a melhor forma, vai depender do público alvo, de toda a interface, da forma como a interacção está concebida.

Se queres impedir que o utilizador mude a nota sem confirmar a gravação, então uma janela com um aviso e um botão de sim/não, é o mais comum, e provavelmente o mais eficaz. Pode não ser o mais eficiente para o utilizador uma vez que o estará sempre a incomodar, mesmo que ele saiba que alterou a nota e que não a quer gravar.

Pessoalmente, o que esperaria de um software desse tipo, é que me avisasse apenas quando saisse do programa, isto é, se eu posso iniciar uma sessão de utilização e ver/alterar/acrescentar/apagar várias notas, então que as minhas alterações sejam persistidas apenas quando eu mandar, assim posso andar pelas notas e não ser incomodado com um aviso, seja ele qual for, e ao mesmo tempo saber que, se me esquecer de gravar as alterações, no momento em que realmente importa, eu recebo o aviso.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

E porque não guardar sempre as alterações?

Se a aplicação tiver um undo, para mim, e se fosse utilizador da aplicação, era a melhor opção.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

E porque não guardar sempre as alterações?

Se a aplicação tiver um undo, para mim, e se fosse utilizador da aplicação, era a melhor opção.

Pessoalmente também  preferiria esta opção. Já agora, Nazgulled, era fixe que se eu, por exemplo, editasse uma nota, passados "x" minutos ele fizesse autosave :P , mas se calhar já é pedir de mais :P

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Sem ofensa, mas não perceberam rigorosamente nada do que eu perguntei...

Um pequeno screen Y/N se quer guardar a nota ou não.

Achas-me assim tão burro para isso nunca me ter passado pela cabeça? Mas não foi isso que eu perguntei...

Não existe a melhor forma, vai depender do público alvo, de toda a interface, da forma como a interacção está concebida.

Se queres impedir que o utilizador mude a nota sem confirmar a gravação, então uma janela com um aviso e um botão de sim/não, é o mais comum, e provavelmente o mais eficaz. Pode não ser o mais eficiente para o utilizador uma vez que o estará sempre a incomodar, mesmo que ele saiba que alterou a nota e que não a quer gravar.

Mais uma vez, o que eu perguntei não tem nada a ver com o público alvo nem com interface nem interacção, nem com etc...

Pessoalmente, o que esperaria de um software desse tipo, é que me avisasse apenas quando saisse do programa, isto é, se eu posso iniciar uma sessão de utilização e ver/alterar/acrescentar/apagar várias notas, então que as minhas alterações sejam persistidas apenas quando eu mandar, assim posso andar pelas notas e não ser incomodado com um aviso, seja ele qual for, e ao mesmo tempo saber que, se me esquecer de gravar as alterações, no momento em que realmente importa, eu recebo o aviso.

É uma ideia interessante mas está longe de ser aquilo que eu tinha em mente para o FireNotes. Principalmente porque isso iria precisar de uma rescrição radical do código que já está praticamente feito e isso é algo que não me posso dar ao luxo neste momento ou nunca mais lanço esta versão nova. Por outro lado, é uma ideia que em alguns cenários poderá não ser muito viável. Supõe que o programa crasha, o Windows crasha, a luz vai abaixo, sei lá, qualquer coisa. Lá vão as tuas alterações à vida...

@Rui Carlos

A única opção de undo existente é aquele que existe por omissão em caixas de texto fornecidas pelo Windows. Lembrem-se de uma coisa, a ideia é ser uma simples aplicação para anotar umas coisinhas. Undo como eu penso que estavas a sugerir, não irá fazer parte do meu FireNotes. Se um dia alguém que pegar no código e fizer esse tipo de modificações, já não tenho nada a ver com isso...

@joaoqalves

Relativamente ao auto-save, eu já pensei nisso mas será algo que não vou implementar para já até a funcionalidade base estiver implementada, numa próxima versão, quem sabe. Eu já pensei mesmo nisso e lembrei-me de alguns problemas que podiam advir disso, mas agora não me lembro quais nem quero pensar nisso agora.

Para terminar, aquilo que eu estava a perguntar era técnicas de código, como programar algo. Não estou a pedir código porque esse não é o problema, mas sim, como programar. Principalmente, como ver se a nota está diferente desde que foi carregada, quando verificar essa diferença, o que acontece quando escolho uma nova nota e etc...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Eu vou explicar mais ou menos a minha ideia.

Se eu bem entendi o funcionamento do programa, esse consiste numa pequena base de dados de notas certo?

Ora bem, na utilização que eu lhe daria, 90% da vezes que eu editasse uma nota, eu não a editaria por acaso, editaria porque pretendia alterá-la e guardar as alterações. Ora, como só em 10% é que eu iria querer recuperar a nota original, parece-me que faz mais sentido que eu precise de dizer quando não quero guardar as alterações, do que quando quero guardar. O undo, bastava apenas permitir isto, que eu pudesse não guardar as alterações.

De referir que nunca usei o programa, e, como tal, posso estar a imaginar a forma de utilização do mesmo de modo errado.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

1) Não, as notas são guardadas em ficheiros de texto no disco e são carregadas conforme necessário. Ou seja, quando o utilizador muda para outra nota, é carregada no disco e é substituída para a actual. As notas são apresentadas numa única caixa de texto.

2) Isso é o uso que tu lhe darias, eu não posso ter em quanto o uso de uma única pessoa. Claro que é importante o uso que todos lhe dão, mas não posso tomar medidas baseado numa sugestão.

3) Como disse, o undo não vai existir.

4) Continua a não ter nada a ver com o problema que eu estou a ter e a pedir ajuda :P

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Tem a ver com o problema na medida em que se guardasses sempre as alterações, não havia problema, certo?

Mas isto também era a opinião de alguém a quem a aplicação não se destina, por isso não interessa...

PS: Seria interessante uma estatística da percentagem de vezes em que os utilizadores (não) querem guardar as alterações... Se calhar é por causa da minha forma de utilizar esse tipo de coisas, mas acho que a maioria do utilizadores guarda as alterações na maior parte das vezes.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Mais uma vez, o que eu perguntei não tem nada a ver com o público alvo nem com interface nem interacção, nem com etc...

Li todo o tópico outra vez e fiquei com a mesma ideia, tinhas um problema de usabilidade, logo, publico alvo, interface, etc., mas depois cheguei ao fim do segundo texto e colocaste e reparei que estavas a falar de código :P

Quanto à questão do programa ir abaixo, faltar a luz, etc., é um problema que não resolves, se faltou a luz, então temos pena tivessem guardado os dados :P. Não é uma questão que possa ser resolvida apenas por software.

Em relação a técnicas de código, a técnica mais comum é a de dirty bit, basicamente tens uma variável que indica o estado de alterações, se estiver dirty, tipicamente um boolean a true, então avisas o utilizador, senão não avisas. Não sei bem o que pretendes aqui, não há grande código a fazer para se determinar se existiram alterações ou não.

Os botões iriam verificar se o "bit" estava activo ou inactivo e agiriam em conformidade.

Não conheço forma diferente de fazer as coisas.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Principalmente, como ver se a nota está diferente desde que foi carregada, quando verificar essa diferença, o que acontece quando escolho uma nova nota e etc...

Geras um hash da nota que tens em memória e comparas com o hash da nota guardada.
0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O problema é como o activo, como o desactivo, quando o activo e quando o desactivo. Como verifico se devo activa ro bit, como verifico que devo desactivar o bit. Esta é a minha questão inicial. Tendo em consideração o exemplo que dei, um click no botão next e muda de nota apagando a anterior tenha havido alterações ou não.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Vocês continuam sem perceber a minha dúvida... Isso do hash já eu tenho.

Primeiro procurava uma forma melhor que essa. Segundo porque o código que tenho com isso do hash tá um caos.

No fundo, aquilo que vos estou a pedir é que me expliquem o algoritmo linha a linha. Ou seja, supondo que eu pergunto "como ordeno array X", as vossas respostas estão a ser "usa o algoritmo quicksort" eu quero uma resposta tipo "usas o algoritmo quicksort e fazes assim, aqui fazes isto aqui aquilo, depois perguntas isto, etc...".

Óbvio que o quicksorte já existe milhares de exemplos ai, mas aquilo que eu quero, não... :P

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não estou a perceber a dificuldade que estás a ter. Acho que o que vou escrever é demasiado básico, e não acredito muito que seja o que perguntas, mas de qualquer maneira...

O problema é como o activo, como o desactivo, quando o activo e quando o desactivo. Como verifico se devo activar o bit, como verifico que devo desactivar o bit.

Tendo no form uma variável bool, no evento TextChanged da TextBox metes o bool a true, quer tenha sido alterado o texto ou repetido exactamente o mesmo texto.

Só o desactivas quando pressionares o botão para mudar de nota.

Não consigo sacudir aquela sensação que não era isto...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

É mais ou menos isso, o problema é que não é só isso lol. Tipo, isso é o pensamento básico para eu fazer o que eu pretendo mas quando eu implementei esta função (estou a reescrever o código todo da aplicação que já fiz há uns tempos) comecei por fazer exactamente isso que disseste, mas não foi o suficiente, casou uma data de problemas, não funcionava como devia, etc... Ou seja, tive que implementar a cena das hashes, por ifs e mais ifs por todo o lado, montes de verificações, variáveis e não sei quê só para ficar a funcionar como devia. E eu lembro-me que na altura custou-me bués e demorei a raciocinar para aquilo ficar a funcionar como devia. E agora estava à procura de algo melhor porque o código que tenho actualmente está um verdadeiro caos.

Mas deixem lá, acho que o melhor é ir, mais uma vez, passo a passo e ir testando intensivamente e ver onde falha... É complicado pedir uma sugestão destas sem se saber exactamente o que se quer (não sei como explicar melhor) e sem apresentar exemplos e código já existe.

Eu lá me desenrasco, apenas pensei que fossem perceber exactamente aquilo que eu procurava e que tivesse alguma sugestão melhor para as hashes.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Acho que o TheDark te deu a resposta.

Não tenho presentes todos os eventos do componente, eventualmente poderão existir mais eventos a considerar, mas no evento que indica alteração de texto, alteras o valor da variável para sinalizar uma modificação.

Nos botões, antes de permitires a substituição da nota, verificas o valor da variável e avisas o utilizador, caso ele cancele a acção, então não deixas mudar a nota e mantens a variável activa. Se o utilizador confirmar que quer perder os dados, mudas a nota e o valor da variável para inactivo. O mesmo se o utilizador carregar no botão para gravar, ou fizer a acção que provoque o gravar.

Mas era isto que querias?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

@Knitter

Isso só não é suficiente, se fosse eu não pedia ajuda porque isso é demasiado básico.

(...)comecei por fazer exactamente isso que disseste, mas não foi o suficiente, casou uma data de problemas, não funcionava como devia, etc... Ou seja, tive que implementar a cena das hashes, por ifs e mais ifs por todo o lado, montes de verificações, variáveis e não sei quê só para ficar a funcionar como devia.(...)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Bem, deste lado não consigo perceber porque não é suficiente, nunca implementei mais que isso, em funcionalidades como a que me parece ser a que pretendes, sendo assim, não sou grande ajuda.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não é suficiente porque isso já eu fiz e como disse, casou mais problemas do que os que resolveu... Ou então na altura eu pensei mais do que o que devia, não sei.

Deixem lá, ainda não voltei a pensar nisto como devia ser. Depois vejo melhor, não ando com paciência...

Obrigado na mesma a todos.

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