Função para divisão silábica
Moderador: Moderadores
- Pablo César
- Usuário Nível 7

- Mensagens: 5312
- Registrado em: 31 Mai 2006 10:22
- Localização: Curitiba - Paraná
Função para divisão silábica
É tenho que confessar que concordo com você, eu peguei o caminho mais dificil. Mas com seu fonte+objs foi como esperava, sem erro. Após visto seu código e assimilado, foi extremamente dificil eu tentar fazer algo melhor, sei que você deu um tempo para dar oportunidade a que eu mesmo o fizesse ou até mesmo outro vira a fazer, mas não aconteceu por motivos da fustração, preguiça e incapacidade.
Tenho muito que lhe agradecer, você é realmente um bom colega, de tamanha grandeza porque comparte de forma desinteressada todo seu conhecimento e fico muito feliz saber que podemos contar na nossa comunidade com pessoas do seu gabarito. O título de "Mestre" não é a toa: é bem merecido aqui. Obrigado colega, mais uma vez !
Tenho muito que lhe agradecer, você é realmente um bom colega, de tamanha grandeza porque comparte de forma desinteressada todo seu conhecimento e fico muito feliz saber que podemos contar na nossa comunidade com pessoas do seu gabarito. O título de "Mestre" não é a toa: é bem merecido aqui. Obrigado colega, mais uma vez !
Um clip-abraço !
Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Re: Função para divisão silábica
Olá Maligno,
Você poderia disponibilizar os fontes das funções auxiliares do quebra.prg para testar.
meu email: asimoesluz@gmail.com
[]´s
Alexandre
Você poderia disponibilizar os fontes das funções auxiliares do quebra.prg para testar.
meu email: asimoesluz@gmail.com
[]´s
Alexandre
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Prefiro deixar aqui mesmo, para o caso de mais alguém querer. Só observe que algumas funções podem ser substituídas por equivalentes de outras LIBs. Como foram feitas há muitos anos, época em que eu não tinha essas LIBs, fiz por minha conta e acabei deixando desse jeito mesmo.
- Anexos
-
FCTAUX.ZIP- (4.02 KiB) Baixado 246 vezes
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.
---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.
---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Re: Função para divisão silábica
Maligno,
Obrigado, vou testar qq coisa, informo neste canal.
[]´s
Obrigado, vou testar qq coisa, informo neste canal.
[]´s
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Re: Função para divisão silábica
Ola Maligno,
A função stranslate é de que lib?, estou testando o quebra com xharbour.
Não achei essa função nos prgs que você disponibilizou.
[]´s
A função stranslate é de que lib?, estou testando o quebra com xharbour.
Não achei essa função nos prgs que você disponibilizou.
[]´s
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Re: Função para divisão silábica
A função STRanslate() foi feita em C e não será possível utilizá-la diretamente no XHarbour. Você terá de fazer uma equivalente. Mas é fácil. Veja o protótipo da função:
STRanslate(cSource,cTable1,cTable2)
cSource é sua string cujos caracteres serão substituídos.
cTable1 e cTable2 são apenas strings com a tabelas de caracteres a pesquisar e a substituir, respectivamente. Exemplo: STRanslate("Simões","õ","o") vai retirar o acento do seu nome.
STRanslate(cSource,cTable1,cTable2)
cSource é sua string cujos caracteres serão substituídos.
cTable1 e cTable2 são apenas strings com a tabelas de caracteres a pesquisar e a substituir, respectivamente. Exemplo: STRanslate("Simões","õ","o") vai retirar o acento do seu nome.
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.
---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.
---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
- Pablo César
- Usuário Nível 7

- Mensagens: 5312
- Registrado em: 31 Mai 2006 10:22
- Localização: Curitiba - Paraná
Função para divisão silábica
Uma função equivalente ao STRanslate() é o UPPERS.prg que tenho disponibilizado no viewtopic.php?f=1&t=7299&p=38963#p38963 o conceito é o mesmo que aquele que usei para Converte caracteres padrão DOS/OEM pra WIN/ANSI e vice-versa irá funcionar.
Outro exemplo, você pode encontrar em: http://dicasprog.codigolivre.org.br/clipper/0007.php
Outro exemplo, você pode encontrar em: http://dicasprog.codigolivre.org.br/clipper/0007.php
Um clip-abraço !
Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
Pablo César Arrascaeta
Compartilhe suas dúvidas e soluções com todos os colegas aqui do fórum.
Evite enviar as dúvidas técnicas por MPs ou eMails, assim todos iremos beneficiar-nos.
-
Amanda P.F
- Usuário Nível 1

- Mensagens: 3
- Registrado em: 29 Jan 2009 16:57
- Localização: Buritama-SP
Re: Função para divisão silábica
Boa tarde!
Estava pesquisando uma função sobre separação silábica, e a que vc criou me pareceu a mais segura de todas, devido a todos os tipos de regras que foram levadas em conta...
Quero saber se ela teria que sofrer muitas modificações para que eu pudesse usa-la no delphi ...
Se for possível, poderia explicar em comentários no código o que cada trecho faz em específico... porque entendi as regras que foram seguidas, mas não a lógica para implementa-las.
Se puder me ajudar ficarei grata!
obrigado pela atenção!
Estava pesquisando uma função sobre separação silábica, e a que vc criou me pareceu a mais segura de todas, devido a todos os tipos de regras que foram levadas em conta...
Quero saber se ela teria que sofrer muitas modificações para que eu pudesse usa-la no delphi ...
Se for possível, poderia explicar em comentários no código o que cada trecho faz em específico... porque entendi as regras que foram seguidas, mas não a lógica para implementa-las.
Se puder me ajudar ficarei grata!
obrigado pela atenção!
Re: Função para divisão silábica
Nem preciso dizer que delphi é uma linguagem bem diferente do Clipper. É possível sim, converter pra delphi. Mas há um porém: se o que você for hifenizar for algum texto com fontes proporcionais, não vai dar certo. Essa função trabalha com programas DOS, onde as fontes são fixas. Até dá pra adaptar. O canvas tem funções de apoio que ajudariam nisso. Mas não é coisa simples (rápida) de fazer. Até pretendo fazer algo parecido numa biblioteca C pra Clipper. Mas nem consegui ânimo ainda.Amanda P.F escreveu:Quero saber se ela teria que sofrer muitas modificações para que eu pudesse usa-la no delphi ...
Portanto, se a fonte for fixa, sem problema. É só converter pra delphi e pronto. Se for fonte proporcional, será um problema um pouco maior. Então, se ainda acha que essa função pode ser útil a você, dê um reply nessa mensagem que dou uma melhorada na documentação.
[]'s
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.
---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
Maligno
---
Não respondo questões técnicas através de MP ou eMail. Não insista.
As dúvidas devem ser postadas no fórum. Desta forma, todos poderão
se beneficiar das respostas.
---
Se um dia precisar de uma transfusão de sangue você perceberá como
é importante a figura do doador. Procure o hemocentro de sua cidade e
se informe sobre a doação de sangue, plaquetas e medula óssea. Doe!
-
Amanda P.F
- Usuário Nível 1

- Mensagens: 3
- Registrado em: 29 Jan 2009 16:57
- Localização: Buritama-SP
Re: Função para divisão silábica
Bom dia Maligno!
estou tentando entender a lógica da sua função para separação silábica, mas tem algumas funções dela que eu não entendi para que servem, porque não conheço a linguagem de programação clipper...
Se for possível, poderia descrever em comentário no código o que cada bloco de código faz em expecífico, para eu possa entender melhor a lógica e assim conseguiu passar a função para ser executada em delphi...
Não entendo, por exemplo, qual a diferença do AllTrim(cWord) e do Len(cWord) para a função Length(cword) do delphi, que retorna o total de caracteres da string...
Esse "SubStr(cWord,i,1)" tem a mesma função que o copy?
Obrigado pela atenção!
estou tentando entender a lógica da sua função para separação silábica, mas tem algumas funções dela que eu não entendi para que servem, porque não conheço a linguagem de programação clipper...
Se for possível, poderia descrever em comentário no código o que cada bloco de código faz em expecífico, para eu possa entender melhor a lógica e assim conseguiu passar a função para ser executada em delphi...
Não entendo, por exemplo, qual a diferença do AllTrim(cWord) e do Len(cWord) para a função Length(cword) do delphi, que retorna o total de caracteres da string...
Esse "SubStr(cWord,i,1)" tem a mesma função que o copy?
Obrigado pela atenção!
-
Amanda P.F
- Usuário Nível 1

- Mensagens: 3
- Registrado em: 29 Jan 2009 16:57
- Localização: Buritama-SP
Re: Função para divisão silábica
Boa tarde!
Então, vou tentar te explicar onde eu quero utilizar a função...estou trabalhando em uma unit de impressão de uma venda razão para ser impressa em impressoras matriciais. Uso o componente RDPrint, e estou precisando quando no caso de uma string possuir mais de 48 caracteres (q é o que cabe em cada linha da minha impressão), a impressão pule e continue na linha seguinte, já consegui fazer essa verificação para pular para proxima linha, mas não consigo separar as silabas, ou mesmo se não for possivel separa-las, queria que caso a palavra não caiba na linha, ela pule para ser impressa na próxima...
Até o momento tenho esse trecho de código, onde faço a verificação do tamanho da string:
Estive pesquisando, e encontrei uma função em delphi que faz isso, mas disseram que não funciona 100%, estou tentando utilizada, mas tb não entendi a lógica dela... (vou colocar aqui, caso queira observá-la)
Aparentemente a sua me parece mais segura, por isso queria entender a lógica dela, para tentar adaptar uma com a msm lógica, mas em delphi...
obrigado!!!
Então, vou tentar te explicar onde eu quero utilizar a função...estou trabalhando em uma unit de impressão de uma venda razão para ser impressa em impressoras matriciais. Uso o componente RDPrint, e estou precisando quando no caso de uma string possuir mais de 48 caracteres (q é o que cabe em cada linha da minha impressão), a impressão pule e continue na linha seguinte, já consegui fazer essa verificação para pular para proxima linha, mas não consigo separar as silabas, ou mesmo se não for possivel separa-las, queria que caso a palavra não caiba na linha, ela pule para ser impressa na próxima...
Até o momento tenho esse trecho de código, onde faço a verificação do tamanho da string:
Código: Selecionar todos
//posição para começar a imprimir a string
posicao_inicial := 1;
// variável descrição recebe a string
descricao := Q_ItemVendaServico.FieldByName('descricao_servico').AsString;
//verifico quantas linhas serão utilizadas
qtde_linhas := (Round(((Length(descricao)) / 48)));
//verifica o tamanho da string
if((Length(descricao)) > 48) then
begin
for x := 1 to qtde_linhas do
begin
//tentei chamar a função aqui:
// hifenar(descricao);
RDprint.ImpF (Linha,13,(Copy(descricao, posicao_inicial, 48)),[Comp17]);
linha := (linha + 1);
posicao_inicial := (posicao_inicial + 48) ;
end;
end
else
RDprint.ImpF (Linha,13,(Copy(Q_ItemVendaServico.FieldByName('descricao_servico').AsString, 1, 48)),[Comp17]);Código: Selecionar todos
function hifenar(PPalavras: string): string;
var
ss: string;
p: Integer;
Letra, c1, c2: string;
begin
PPalavras := TRIM(PPalavras);
ss := '';
for p := 1 to 48 do
begin
LETRA := UPPERcase(Copy(PPalavras, p, 48));
if Pos(Letra, 'AÀÄÃÁÂEÈËÉÊIÌÏÍÎOÕÖÕÓÔUÙÜÚÛYŸÝ') > 0 then
ss := ss + 'V'
else
if Pos(LETRA, 'BCDFGHJLMNPQRSTVXZKYW' + 'Çç') > 0 then
ss := ss + 'C'
else
ss := ss + '?';
end;
p := Pos('VCV', ss);
while (p <> 0) do
begin
PPalavras := Copy(PPalavras, 1, p) + '-' + rightstr(PPalavras, Length(PPalavras) - p);
ss := Copy(ss, 1, p) + '-' + rightstr(ss, Length(ss) - p);
p := Pos('VCV', ss);
end;
p := Pos('VCCV', ss);
while p <> 0 do
begin
C1 := UPPERcase(Copy(PPalavras, p + 1, 1));
C2 := UPPERcase(Copy(PPalavras, p + 2, 1));
if ((not ansicontainstext(C1, 'JLHMNQRSXZ')) and ansicontainstext(C2, 'LR')) or ((Pos(C1, 'CLNPST') > 0) and (Pos(C2, 'H') > 0)) then
begin
// V-CCV
PPalavras := Copy(PPalavras, 1, p) + '-' + rightstr(PPalavras, Length(PPalavras) - p);
ss := Copy(ss, 1, p) + '-' + rightstr(ss, Length(ss) - p);
end
else
begin
// VC-CV
PPalavras := Copy(PPalavras, 1, p + 1) + '-' + rightstr(PPalavras, Length(PPalavras) - (p + 1));
ss := Copy(ss, 1, p + 1) + '-' + rightstr(ss, Length(ss) - (p + 1));
end;
p := Pos('VCCV', ss);
end;
p := Pos('VCCCV', ss);
while p <> 0 do
begin
C1 := UPPERcase(Copy(PPalavras, p + 2, 1));
C2 := UPPERcase(Copy(PPalavras, p + 3, 1));
if ((not ansicontainstext(C1, 'JLHMNQRSXZ')) and ansicontainstext(C2, 'LR')) or (ansicontainstext(C1, 'CLNPST') and (C2 = 'H')) then
begin
PPalavras := Copy(PPalavras, 1, p + 1) + '-' + rightstr(PPalavras, Length(PPalavras) - (p + 1));
ss := Copy(ss, 1, p + 1) + '-' + rightstr(ss, Length(ss) - (p + 1));
end
else
begin
PPalavras := Copy(PPalavras, 1, p + 2) + '-' + rightstr(PPalavras, Length(PPalavras) - (p + 2));
ss := Copy(ss, 1, p + 2) + '-' + rightstr(ss, Length(ss) - (p + 2));
end;
p := Pos('VCCCV', ss);
end;
p := Pos('VCCCCV', ss);
while p <> 0 do
begin
PPalavras := Copy(PPalavras, 1, p + 2) + '-' + rightstr(PPalavras, Length(PPalavras) - (p + 2));
ss := Copy(ss, 1, p + 2) + '-' + rightstr(ss, Length(ss) - (p + 2));
p := Pos('VCCCCV', ss);
end;
p := Pos('VV', ss);
while p <> 0 do
begin
if not Pos('!' + UPPERcase(Copy(PPalavras, p, 2)) + '!', '!AI!AO!ÃO!ãO!AU!EI!EU!OE!ÕE!õE!OI!OO!OU!' + ifthen(p <> 1, ifthen(Pos(UPPERcase(Copy(PPalavras, p - 1, 1)), 'GQ') > 0, 'UA!ÜA!üA!UE!ÜE!üE!UI!ÜI!üI!UO!ÜO!üO!UU!ÜU!üU!', ''), '')) > 0 then
begin
PPalavras := Copy(PPalavras, 1, p) + '-' + rightstr(PPalavras, Length(PPalavras) - p);
ss := Copy(ss, 1, p) + '-' + rightstr(ss, Length(ss) - p);
end;
if Pos('VV', rightstr(ss, Length(ss) - p)) <> 0 then
p := p + Pos('VV', rightstr(ss, Length(ss) - p))
else
p := 0;
end;
result := (PPalavras);
end;obrigado!!!
- Luciano Bonfim
- Usuário Nível 3

- Mensagens: 414
- Registrado em: 23 Ago 2007 09:34
- Localização: Rio de Janeiro / São Paulo
- Contato:
Re: Função para divisão silábica
Caro Malígno e Pablo Cesar,
Muito Obrigado pela ajuda de vcs... caiu como uma luva, era o que eu estava precisando.
Muito Obrigado pela ajuda de vcs... caiu como uma luva, era o que eu estava precisando.
Muito Obrigado,
Luciano Bonfim de Azevedo
www.bonfim.com.br
luciano@bonfim.com.br
www.linkedin.com/in/lucianobonfim
Skype : lucianobonfim
Luciano Bonfim de Azevedo
www.bonfim.com.br
luciano@bonfim.com.br
www.linkedin.com/in/lucianobonfim
Skype : lucianobonfim
Função para divisão silábica
Caro Maligno e demais colegas,
Pesquisando no fórum, encontrei este post que vem bem ao encontro das minhas necessidades.
Estou precisando fazer um alinhamento na margem direita na impressão de uns relatórios. Nem precisaria propriamente de divisão silábica. Seria suficiente que ele não separasse as palavras aleatoriamente; poderia não fazer separação alguma. Mas fazendo divisão silábica fica ainda melhor.
Peguei o exemplo do Maligno neste post, que me pareceu excelente. Mas não estou conseguindo usá-la.
Em princípio, deu problema pela falta da função stranslate. Tentei substitui-la por outra que tenho aqui que parece fazer a mesma coisa, mas não funcionou.
Daí eu baixei o arquivo quebra.zip. Só que não estou conseguindo compilar a stransla.obj junto ao meu sistema.
Coloquei o arquivo de compilação assim:
O arquivo está na pasta, mas está dando "No such file or directory" na compilação.
Já tentei também colocar o stransla.obj junto com os prgs, dá no mesmo.
Alguém poderia me ajudar com isto?
Pesquisando no fórum, encontrei este post que vem bem ao encontro das minhas necessidades.
Estou precisando fazer um alinhamento na margem direita na impressão de uns relatórios. Nem precisaria propriamente de divisão silábica. Seria suficiente que ele não separasse as palavras aleatoriamente; poderia não fazer separação alguma. Mas fazendo divisão silábica fica ainda melhor.
Peguei o exemplo do Maligno neste post, que me pareceu excelente. Mas não estou conseguindo usá-la.
Em princípio, deu problema pela falta da função stranslate. Tentei substitui-la por outra que tenho aqui que parece fazer a mesma coisa, mas não funcionou.
Daí eu baixei o arquivo quebra.zip. Só que não estou conseguindo compilar a stransla.obj junto ao meu sistema.
Coloquei o arquivo de compilação assim:
Código: Selecionar todos
# coloque aqui suas libs, precedidas pela letra "l" (minúscula):
-lxhb
-lhbwin
-lhbtip
-lhbct
-lhbHPdf
-lhbZebra
-lhbmisc
-llibmysql
rddsql.hbc
sddodbc.hbc
hbwin.hbc
stransla.obj
# coloque aqui os parâmetros de compilação:
-quiet
-jobs=4
-oTAGENDA
# coloque aqui seus arquivos PRGs:
\prg\TAGENDA.PRG
\prg\AGTEL.PRG
\prg\COMUNS.PRG
\prg\CONTAG.PRG
\prg\BANCO.PRG
\prg\AGCOM.PRG
\prg\ERRORS2.PRG
\prg\GETSYS.PRG
\prg\MANUTENCAO.PRGJá tentei também colocar o stransla.obj junto com os prgs, dá no mesmo.
Alguém poderia me ajudar com isto?
Inacio de Carvalho Neto
-
alxsts
- Colaborador

- Mensagens: 3092
- Registrado em: 12 Ago 2008 15:50
- Localização: São Paulo-SP-Brasil
Função para divisão silábica
Olá!
A mensagem que você informa estar recebendo é auto explicativa. O arquivo não foi encontrado no local em que foi procurado.
Mesmo que você consiga adicionar este arquivo .obj à sua compilação, ela não funcionará. Este arquivo certamente foi gerado pelo Clipper.Exe, e está em formato 16 bits. Para incluir no teu projeto Harbour, o mesmo teria que estar em formato 32 ou 64 bits. Será preciso reconstruir esta função ou encontrar seu fonte original.
A mensagem que você informa estar recebendo é auto explicativa. O arquivo não foi encontrado no local em que foi procurado.
Mesmo que você consiga adicionar este arquivo .obj à sua compilação, ela não funcionará. Este arquivo certamente foi gerado pelo Clipper.Exe, e está em formato 16 bits. Para incluir no teu projeto Harbour, o mesmo teria que estar em formato 32 ou 64 bits. Será preciso reconstruir esta função ou encontrar seu fonte original.
[]´s
Alexandre Santos (AlxSts)
Alexandre Santos (AlxSts)
Função para divisão silábica
Pois é. O estranho é que o arquivo está sim no local.
Mas se não adianta compilar esse obj, o jeito é esperar o Maligno disponibilizar a função, correto?
Mas se não adianta compilar esse obj, o jeito é esperar o Maligno disponibilizar a função, correto?
Inacio de Carvalho Neto

