QUEBRAR STRING DE 400 CARACTERES
Boa noite a todos.
Estou montando uma impressão do histórico clinico do paciente. O Dentista informa os dados clÃnicos que gravado com um campo text no SQL Server, porém na impressão cabem somente 100 caracteres por linha e sendo assim como tem 400 caracteres seriam 4 linhas certo ? Certo, mas para isso fiz algo muito doido, primeiro verifico o tamanho da string. Na impressão da primeira linha faço substring(0,100), segunda linha substring(101,100), terceira linha substring(201,100) e assim vai.
Teria algo mais amigável para fazer isso ? Alguma função pronta do próprio C#? Segue a doideira que montei.
Estou montando uma impressão do histórico clinico do paciente. O Dentista informa os dados clÃnicos que gravado com um campo text no SQL Server, porém na impressão cabem somente 100 caracteres por linha e sendo assim como tem 400 caracteres seriam 4 linhas certo ? Certo, mas para isso fiz algo muito doido, primeiro verifico o tamanho da string. Na impressão da primeira linha faço substring(0,100), segunda linha substring(101,100), terceira linha substring(201,100) e assim vai.
Teria algo mais amigável para fazer isso ? Alguma função pronta do próprio C#? Segue a doideira que montei.
private void printAccomplished(Patient patient, DataTable dt)
{
bool simpleLine = false;
WriteLine(page);
foreach (DataRow dr in dt.Rows)
{
int startString = 1;
int endString = 100;
int countLine = 0;
if (Convert.ToBoolean(dr[[Ô]checked[Ô]]) == true)
{
int totalString = dr[[Ô]accomplished[Ô]].ToString().Length;
for (int line = 1; line <= 6; line++)
{
if (startString >= totalString) break;
countLine++;
if (dr[[Ô]accomplished[Ô]].ToString().Length > 100)
{
string fraseHistorico = Mid(dr[[Ô]accomplished[Ô]].ToString(), startString, endString);
simpleLine = false;
gfx.DrawString(fraseHistorico, fontNormal, XBrushes.Black,
new XRect(25, lineNow, margemR, lineNow), XStringFormats.TopLeft);
startString += fraseHistorico.Length;
endString = (totalString - startString);
if ((totalString - startString) > 100)
{
endString = 101;
}
else
{
endString++;
}
printJumpLine(1);
}
else
{
simpleLine = true;
gfx.DrawString(dr[[Ô]accomplished[Ô]].ToString(), fontNormal, XBrushes.Black,
new XRect(25, lineNow, margemR, lineNow), XStringFormats.TopLeft);
printJumpLine(6);
break;
}
}
if (countLine < 6)
printJumpLine(simpleLine == true ? countLine : countLine + 1);
WriteValidatedAndSignature(patient);
}
else
{
printJumpLine(10);
}
}
}
private string Mid(string valor, int inicio, int quant)
{
int T = valor.Length;
if (T < quant)
{
quant = T;
}
string strMid = valor.Substring(inicio - 1, quant);
return strMid;
}
Esse código gerará uma lista de strings delimitando-a pelo tamanho especificado.
public List<String> SepararStrings(string valor, int tamanho)
{
List<string> lista = new List<string>();
if (tamanho <= valor.Length) {
for (int i = 0; i < valor.Length; i = i + tamanho)
{
if (i + tamanho < valor.Length)
lista.Add(valor.Substring(i, tamanho));
else
lista.Add(valor.Substring(i, valor.Length - i));
}
}
return lista;
}
//Para usar você poderia fazer assim:
List<string> lista = new List<string>();
lista = SepararStrings([Ô]suafrase[Ô], 100);
for (int i = 0; i < lista.Count - 1; i++)
{
gfx.DrawString(lista[i], fontNormal, XBrushes.Black, new XRect(25, lineNow, margemR, lineNow), XStringFormats.TopLeft);
}
Era isso que você estava querendo?
Vou fazer o teste agora, estava em outro projeto....
Certo JABA, funcionou. Adicionei algumas particularidades pois precisa pular algumas linhas entre os históricos.
Ficou assim:
Ficou assim:
private void printAccomplished(Patient patient, DataTable dt)
{
bool simpleLine = false;
WriteLine(page);
foreach (DataRow dr in dt.Rows)
{
int countLine = 0;
if (Convert.ToBoolean(dr[[Ô]checked[Ô]]) == true)
{
string fraseHistorico = dr[[Ô]accomplished[Ô]].ToString();
List<string> lista = new List<string>();
lista = SepararStrings(fraseHistorico, 130);
if (fraseHistorico.Length > 130)
{
countLine = lista.Count;
simpleLine = false;
for (int i = 0; i < lista.Count; i++)
{
gfx.DrawString(lista[i], fontNormalSmall, XBrushes.Black, new XRect(25, lineNow, margemR, lineNow), XStringFormats.TopLeft);
printJumpLine(1);
}
}
else
{
countLine = 8;
simpleLine = true;
gfx.DrawString(fraseHistorico, fontNormalSmall, XBrushes.Black,
new XRect(25, lineNow, margemR, lineNow), XStringFormats.TopLeft);
}
printJumpLine(simpleLine == true ? countLine : (8 - countLine));
WriteValidatedAndSignature(patient);
}
else
{
printJumpLine(12);
}
}
}
e a impressão ficou assim:
O problema é que a separação de sÃlaba fica zoada quando muda de linha...
O problema é que a separação de sÃlaba fica zoada quando muda de linha...
// retirei o tratamento condicional pra pegar valores menores do que 130 e eliminei os caracteres em branco do inicio de cada sentença
public List<String> SepararStrings(string valor, int tamanho)
{
List<string> lista = new List<string>();
for (int i = 0; i < valor.Length; i = i + tamanho)
{
if (i + tamanho < valor.Length)
lista.Add(valor.Substring(i, tamanho).TrimStart());
else
lista.Add(valor.Substring(i, valor.Length - i).TrimStart());
}
return lista;
}
private void printAccomplished(Patient patient, DataTable dt)
{
WriteLine(page);
foreach (DataRow dr in dt.Rows)
{
if (Convert.ToBoolean(dr[[Ô]checked[Ô]]) == true)
{
string fraseHistorico = dr[[Ô]accomplished[Ô]].ToString();
List<string> lista = new List<string>();
lista = SepararStrings(fraseHistorico, 130);
for (int i = 0; i < lista.Count; i++)
{
gfx.DrawString(lista[i], fontNormalSmall, XBrushes.Black, new XRect(25, lineNow, margemR, lineNow), XStringFormats.TopLeft);
printJumpLine(1);
}
WriteValidatedAndSignature(patient);
}
else
{
printJumpLine(12);
}
}
}
OK...a noite farei o teste novamente....
Continua a mesma coisa...separação de silaba zoada..
A separação ocorre porque a string está quebrando no meio de uma palavra.
achei um algoritimo de separação de sÃlabas e vou tentar usa-lo...
Tópico encerrado , respostas não são mais permitidas