Forum > Portuguese

Ajuda com loop (for)

(1/2) > >>

meulinux:
Companheiros de profissão, saudações.

Estou um pouco enrolado com a lógica.
Estou criando um programa para Linux, uma Bíblia (dentre muitas existentes). Vou direto ao que interessa:

Tenho 3 TListBox:
lbxLivros (com os livros da Bíblia);
lbxCapitulos (com os capítulos de cada livro da bíblia);
lbxVersiculos (com os versículos de cada capítulo).


lbxLivros: Gênesis, Êxodo, Levítico, Números, Deuteronômio, ...

Se eu selecionar o item "Gênesis", eu preencho o lbxCapítulos com a quantidade de capítulos existentes neste livro, que são 50 capítulos:


--- Code: ---for n := 1 to 50 do
    lbxCapitulos.Items.Add(IntToStr(n));

--- End code ---

Até neste ponto não complica em nada, estou usando um laço bem bolado com um case.
Tenho o laço até o livro Apocalipse, cada um inserindo a quantidade de capítulo existente em cada livro.
Agora, para cada item selecionado do capítulo, tenho de inserir no lbxVersiculos, a quantidade de versículos existente em cada capítulo de cada livro. Complicou!!!
Bom, a rotina é a mesma, mas preciso me basear em algo e é aí que complica.

Eu sei em que livro eu estou (usando o case), digamos que seja o livro de Gênesis.

Foi selecionado o capítulo, digamos... capítulo 1, sei disso com o for abaixo:


--- Code: ---for cap := 0 to lbxCapitulos.Items.Count -1 do
         begin
           if lbxCapitulos.GetSelectedText = lbxCapitulos.Items.Strings[cap] then
           begin
             //LabelCapitulos.Caption := lbxCapitulos.GetSelectedText;

{
Eu fiz o teste com um TLabel acima, cada capítulo selecionado, me mostra num TLabel o número do capítulo.
Só que eu quero inserir em lbxVersiculo a quantidade de cada versículo correspondente ao capítulo selecionado. Alguém tem uma dica que possa ajudar a sair disso?
}
// Encontrou? então sai com o break abaixo
             Break;
             Exit;
           end;
         end;

--- End code ---

O primeiro capítulo do livro de Gênesis contém 31 versículos, portanto, se o primeiro item da listbox (lbxCapitulos) for selecionado, seria inserido em lbxVersiculos os números 1 ao 31.

Sou agradecido, qualquer ajuda é bem-vinda.

Se você sabe traduzir bem para o idioma inglês, creio que se essa pergunta fosse traduzida, muita gente poderia ajudar.

felipemdc:
Olá, o programa vai ser gratuíto? Se sim, eu acho que seria legal desenvolver ele no subversion do Lazarus-CCR, você pode abrir um diretorio em lazarus-ccr/applications/ e trabalhar lá, daí com todo código visível fica mais fácil ajudar. Qual o nome do projeto?

Quanto ao seu problema em questão, me parece que você está utilizando uma estrutura de dados inadequada. Pense em suportar várias traduções desde já, depois fica muito difícil mudar mais pra frente. Crie estruturas de dados flexíveis. Você está lendo os textos da Bíblia da onde?

Eu faria assim:

1> Uma unidade que declara as estruturas de dados contendo a biblia, por exemplo bibledata.pas

type
  TChapter = class
    Text: TStringList;
  end;

  TBook = class
    Chapters: TFPList; // TChapter
    ChapterNames: TStringList;
    constructor Create;
    destructor Destroy; override;
    procedure AddChapter(AVersible: TChapter; AChapterName: string);
  end;

  TBookCollection = class
    Books: TFPList; // TBook
    BookNames: TStringList;
    constructor Create;
    destructor Destroy; override;
    procedure AddBook(ABook: TBook; ABookName: string);
  end;

var
  Bible: TBookCollection;

implementation

initialization

  Bible := TBookCollection.Create;

finalization

  Bible.Free;

end.

2> Uma unidade separada para ler o conteúdo da Bíblia de um arquivo

3> Depois crie uma rotina para converter os dados dessa estrutura para a GUI. Esse é o jeito correto de programar, tudo separado em módulos reutilizaveis, pense que alguém pode criar uma GUI Web usando as suas classes base.

Para escrever esses dados para o form é fácil. Por exemplo, dado um livro selecionado, escrever os capítulos:

lbxCapitulos.Items.Clear;
myBook := Bible.Books.Items[SelectedBook];
for i := 0 to myBook.Chapters.Count - 1 do
  lbxCapitulos.Items.Add(myBook.ChapterNames.Strings);

meulinux:
Não estou fazendo um projeto para distribuição, foi solicitado por uma igreja, eles usam o Linux e no Linux não conheço nenhum que seja free, e, o mesmo deve ter umas funcionalidades interna para o uso da igreja. Não pensei nisso que você disse. Posso até desenvolver outra mais tarde e disponibilizar, mas só quando tiver pelo menos 60% pronta.

ezlage:
Meu amigo, tudo bem?

Não seria mais fácil você ter uma tabela pra Livro, outra pra Capítulo e Outra pra Versículo não? mesmo que em DBF, por exemplo...

Assim você não precisa de FOR nem CASE para fazer os laços, cria apenas um campo LOOKUP em cada tabela que associa cada versículo ao seu capítulo e cada capítulo ao seu livro.

Espero ter ajudado.

Abraço.

meulinux:

--- Quote from: ezlage on September 04, 2011, 03:03:40 pm ---Meu amigo, tudo bem?

Não seria mais fácil você ter uma tabela pra Livro, outra pra Capítulo e Outra pra Versículo não? mesmo que em DBF, por exemplo...

Assim você não precisa de FOR nem CASE para fazer os laços, cria apenas um campo LOOKUP em cada tabela que associa cada versículo ao seu capítulo e cada capítulo ao seu livro.

Espero ter ajudado.

Abraço.

--- End quote ---


Olá Ezlage.

Eu vou usar Sqlite3 neste projeto, mas só vou incluir os versículos da Bíblia. O controle eu vou fazer manualmente mesmo. Eu já encontrei a resposta, criei outro case e removi o for que estava tentando solucionar.
Agradeço sua dica.

Navigation

[0] Message Index

[#] Next page

Go to full version