Форум: "Начинающим";
Текущий архив: 2007.08.19;
Скачать: [xml.tar.bz2];
ВнизПроблема с "я" Найти похожие ветки
← →
vasIZmax © (2007-07-20 03:05) [0]Столкнулся с такой проблемкой: буква "я" не выводится в caption.
Дело в том что после работы с программой данные записываются в ini-файл. Потом при запуске данные считываются из этого файла и записываются по различным Edit"am, Panel and Button, и тут возникает указанная проблемка (предположим считывается слово "статья"): в edit - слово "статья" нормально записывается, потом на каждый символ создается панель, и в свойство caption выводится по одному символу, и панель где должна быть буква "я" - пустая.
В чем может быть проблема?
← →
ASoft (2007-07-20 04:50) [1]...
> потом на каждый символ создается панель, и в свойство caption
> выводится по одному символу
как создаешь? кусок кода давай..
← →
vasIZmax © (2007-07-20 05:17) [2]Пишу пошагово (может за одно и саму станет ошибка видна).
При первом запуске проги в поле едит пишем слово "Статья".
Нажимаем кнопку и создаются панели таким образом:procedure tform1.CreateBut;
Var
wer: TPanel;
s:string;
t:integer;
Begin
t:=0;
s:=edit1.Text;
repeat
wer:=TPanel.Create(form1);
inc(t);
wer.Top:= random(350)+60;
wer.Left:=random(350)+60;
wer.Name:="but"+inttostr(t);
wer.Caption:=s[t];
wer.Font.Size:=16;
wer.Parent:=form1;
until t=length(edit1.Text);
t:=0;
end;
Затем закрываем форму.
В событии destroy пишем следующий код:procedure TForm1.FormDestroy(Sender: TObject);
var
Ini: Tinifile;
s:string;
begin
s:=edit1.Text;
Ini:=TiniFile.Create(extractfilepath(paramstr(0))+"MyIni.ini");
if s<>"" then
ini.WriteString("Edit_Text", "edit1", s)
else
ini.WriteString("Edit_Text", "edit1", "Статья");
Ini.Free;
end;
Потом при следующем запуске программы(событие Create) пишу следующее:procedure TForm1.FormCreate(Sender: TObject);
var
Ini: Tinifile;
tr: integer;
begin
randomize;
Ini:=TiniFile.Create(extractfilepath(paramstr(0))+"MyIni.ini");
edit1.Text:=ini.ReadString("Edit_Text", "edit1","Статья");
CreateBut;
Ini.Free;
end;
И в итоге: создаются нужное количество панелей ("Статья", шесть букв->шесть панелей),
но на панели на которой должна быть буква "я" - ничего нет.
В чем проблема? Какой-то нюанс упускаю, а вот какой подскажите, плиз.
ЗЫ. С подобным сталкивался при работе с OpenGl выводом текста, но так как был выбран другой путь реализации не стал разбираться в чем проблема:((... а стоило
ЗЫЫ. Часть кода опущена, но это на суть проблемы ни каим образом не влияет!
← →
ASoft (2007-07-20 06:21) [3]Попробуй так:
procedure tform1.CreateBut;
Var
wer: TPanel;
s:string;
t:integer;
Begin
t:=1;
s:=edit1.Text;
While t<=length(edit1.Text) do
begin
wer:=TPanel.Create(form1);
wer.Top:= random(350)+60;
wer.Left:=random(350)+60;
wer.Name:="but"+inttostr(t);
wer.Caption:=s[t];
wer.Font.Size:=16;
wer.Parent:=form1;
inc(t);
end;
end;
в твоем коде, при достижении t=6 сразу происходит выход их цикла и 6 буква не обрабатывается
← →
vasIZmax © (2007-07-20 06:25) [4]
> ASoft (20.07.07 06:21) [3]
А если будет не "статья", а "проявка"?:-)
здесь в чем-то другом проблема((
← →
ASoft (2007-07-20 06:40) [5]
> А если будет не "статья", а "проявка"?:-)
а ты проверь
← →
vasIZmax © (2007-07-20 06:46) [6]
> ASoft (20.07.07 06:40) [5]
Результат = 0...
Даже если так:ini.WriteString("Edit_Text", "edit1", "Прояяяяявка");
ни одной не появляется буквы "я"
← →
ASoft (2007-07-20 07:18) [7]Я - появляется, я - нет:-)
← →
ASoft (2007-07-20 07:32) [8]поставь пробел перед s[t]: wer.Caption:=" "+s[t];
если тебя это устроит
← →
vasIZmax © (2007-07-20 07:37) [9]
> ASoft (20.07.07 07:32) [8]
Хм... странный ход, но главное - рабочий. И меня устроит. Спс.
ЗЫ. А вот почему без пробела не желает появляться буква, вот это интересно)))
← →
Anatoly Podgoretsky © (2007-07-20 07:45) [10]> vasIZmax (20.07.2007 07:37:09) [9]
Потому что у нее код $FF
← →
vasIZmax © (2007-07-20 08:17) [11]
> Anatoly Podgoretsky © (20.07.07 07:45) [10]
И как такие проблемы обходить?
← →
Desdechado © (2007-07-20 10:45) [12]Если мне не изменяет память, это проблема конкретной версии Дельфи (кстати, твоя не указана).
И пробел в строке должен решать проблему.
← →
vasIZmax © (2007-07-20 11:01) [13]
> Desdechado © (20.07.07 10:45) [12]
Сорри, версия 7.
В данном случае да - пробел решает проблему.
А вот код (сразу скажу что не мой, взято у Краснова из примеров к книге по OpenGL) - так в нем не решается эта проблема пробелом (так и быть сейчас спрошу, все-равно через недельку-другую спросил бы)unit frmMain;
interface
uses
Windows, Messages, Classes, Graphics, Forms, ExtCtrls, Menus,
Controls, Dialogs, SysUtils,
OpenGL;
type
TfrmGL = class(TForm)
procedure FormCreate(Sender: TObject);
procedure FormResize(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure FormPaint(Sender: TObject);
procedure FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
private
DC : HDC;
hrc : HGLRC;
procedure InitializeRC;
procedure SetDCPixelFormat;
end;
const
GLF_START_LIST = 1000;
var
frmGL: TfrmGL;
implementation
{$R *.DFM}
{=======================================================================
Вывод текста}
procedure OutText (Litera : PChar);
begin
glListBase(GLF_START_LIST);
glCallLists(Length (Litera), GL_UNSIGNED_BYTE, Litera);
end;
{=======================================================================
Процедура инициализации источника цвета}
procedure TfrmGL.InitializeRC;
begin
glEnable(GL_DEPTH_TEST);// разрешаем тест глубины
glEnable(GL_LIGHTING); // разрешаем работу с освещенностью
glEnable(GL_LIGHT0); // включаем источник света 0
end;
{=======================================================================
Рисование картинки}
procedure TfrmGL.FormPaint(Sender: TObject);
begin
glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
// вывод текста
OutText ("Проба");
SwapBuffers(DC);
end;
{=======================================================================
Установка формата пикселей}
procedure TfrmGL.SetDCPixelFormat;
var
nPixelFormat: Integer;
pfd: TPixelFormatDescriptor;
begin
FillChar(pfd, SizeOf(pfd), 0);
With pfd do begin
dwFlags := PFD_DRAW_TO_WINDOW or
PFD_SUPPORT_OPENGL or
PFD_DOUBLEBUFFER;
cDepthBits:= 32;
end;
nPixelFormat := ChoosePixelFormat(DC, @pfd);
SetPixelFormat(DC, nPixelFormat, @pfd);
end;
{=======================================================================
Создание окна}
procedure TfrmGL.FormCreate(Sender: TObject);
begin
DC := GetDC(Handle);
SetDCPixelFormat;
hrc := wglCreateContext(DC);
wglMakeCurrent(DC, hrc);
glClearColor (0.3, 0.4, 0.6, 1.0);
wglUseFontOutlines (Canvas.Handle, 0, 255, GLF_START_LIST, 50, 0.15,
WGL_FONT_POLYGONS, nil);
InitializeRC;
end;
{=======================================================================
Изменение размеров окна}
procedure TfrmGL.FormResize(Sender: TObject);
begin
glMatrixMode(GL_PROJECTION);
glLoadIdentity;
gluPerspective(15.0, ClientWidth / ClientHeight, 1.0, 20.0);
glViewport(0, 0, ClientWidth, ClientHeight);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity;
glTranslatef(-0.8, -0.7, -9.0);
glRotatef(30.0, 1.0, 1.0, 0.0);
glRotatef(30.0, 0.0, 1.0, 0.0);
InvalidateRect(Handle, nil, False);
end;
procedure TfrmGL.FormDestroy(Sender: TObject);
begin
glDeleteLists (GLF_START_LIST, 256);
wglMakeCurrent(0, 0);
wglDeleteContext(hrc);
ReleaseDC(Handle, DC);
DeleteDC(DC);
end;
procedure TfrmGL.FormKeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
If Key = VK_ESCAPE then Close
end;
end.
вот здесь пробел не помогает((
ЗЫ. вот уж это "я"(((
← →
Ivolg © (2007-07-20 11:13) [14]Можно так:
var
S, S2: String;
I: Integer;
Wer: TPanel;
begin
S := Edit1.Text;
for I := 0 to Length(Edit1.Text) - 1 do
begin
S2 := Copy(S, 1, 1);
Delete(S, 1, 1);
Wer := TPanel.Create(Form1);
Wer.Top := Random(350) + 60;
Wer.Left := Random(350) + 60;
Wer.Name := "but" + Inttostr(I);
Wer.Caption := S2;
Wer.Font.Size :=16;
Wer.Parent := Form1;
end;
end;
← →
Игорь Шевченко © (2007-07-20 11:36) [15]
> Если мне не изменяет память, это проблема конкретной версии
> Дельфи (кстати, твоя не указана).
Это проблема Windows
http://www.delphikingdom.com/asp/articles_forum.asp?ArticleID=628
← →
Ivolg © (2007-07-20 11:43) [16]Немного доработал:
var
S, S2: String;
I: Integer;
Wer: TPanel;
begin
S := Edit1.Text;
for I := 0 to Length(Edit1.Text) - 1 do
begin
S2 := Copy(S, 1, 1);
Delete(S, 1, 1);
Wer := TPanel.Create(Form1);
Wer.Top := Random(350) + 60;
Wer.Left := Random(350) + 60;
Wer.Name := "but" + Inttostr(I);
if (S2 = "я") or (S2="Я") then
Wer.Caption := " "+S2
else
Wer.Caption := S2;
Wer.Font.Size :=16;
Wer.Parent := Form1;
end;
end;
← →
vasIZmax © (2007-07-20 11:46) [17]
> Ivolg © (20.07.07 11:43) [16]
Имхо,
> if (S2 = "я") or (S2="Я") then
подчеркнутое лишнее. проверять надо только на маленькую "я", с большой все в порядке. Но о copy/delete даже не подумал, спс))
← →
Stanislav © (2007-07-20 12:22) [18]Главное чтобы проблем с собственным "Я" небыло :-)
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2007.08.19;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.039 c