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