Página 2 de 2

Função para divisão silábica

Enviado: 03 Set 2008 21:02
por Pablo César
É 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 !

Re: Função para divisão silábica

Enviado: 13 Set 2008 20:56
por asimoes
Olá Maligno,

Você poderia disponibilizar os fontes das funções auxiliares do quebra.prg para testar.

meu email: asimoesluz@gmail.com

[]´s

Alexandre

Enviado: 13 Set 2008 21:27
por Maligno
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.

Re: Função para divisão silábica

Enviado: 13 Set 2008 21:39
por asimoes
Maligno,

Obrigado, vou testar qq coisa, informo neste canal.

[]´s

Re: Função para divisão silábica

Enviado: 13 Set 2008 22:09
por asimoes
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

Re: Função para divisão silábica

Enviado: 13 Set 2008 22:55
por Maligno
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. :)

Função para divisão silábica

Enviado: 15 Set 2008 11:43
por Pablo César
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

Re: Função para divisão silábica

Enviado: 29 Jan 2009 19:23
por Amanda P.F
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!

Re: Função para divisão silábica

Enviado: 29 Jan 2009 20:03
por Maligno
Amanda P.F escreveu:Quero saber se ela teria que sofrer muitas modificações para que eu pudesse usa-la no delphi ...
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. :)))

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.

Re: Função para divisão silábica

Enviado: 30 Jan 2009 10:59
por Amanda P.F
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!

Re: Função para divisão silábica

Enviado: 30 Jan 2009 13:24
por Amanda P.F
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:

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]);
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)

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;
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!!!

Re: Função para divisão silábica

Enviado: 27 Mai 2009 01:18
por Luciano Bonfim
Caro Malígno e Pablo Cesar,

Muito Obrigado pela ajuda de vcs... caiu como uma luva, era o que eu estava precisando.

Função para divisão silábica

Enviado: 03 Fev 2016 17:58
por cjp
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:

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.PRG
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?

Função para divisão silábica

Enviado: 03 Fev 2016 23:08
por alxsts
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.

Função para divisão silábica

Enviado: 04 Fev 2016 12:10
por cjp
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?