![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Проблема с "я"
vasIZmax © (2007-07-20 03:05:00)Столкнулся с такой проблемкой: буква "я" не выводится в caption.
Дело в том что после работы с программой данные записываются в ini-файл. Потом при запуске данные считываются из этого файла и записываются по различным Edit'am, Panel and Button, и тут возникает указанная проблемка (предположим считывается слово "статья"): в edit - слово "статья" нормально записывается, потом на каждый символ создается панель, и в свойство caption выводится по одному символу, и панель где должна быть буква "я" - пустая.
В чем может быть проблема?
Stanislav (2007-07-20 12:22:00) [1]Главное чтобы проблем с собственным "Я" небыло :-)
vasIZmax (2007-07-20 11:46:00) [2]
> Ivolg © (20.07.07 11:43) [16]
Имхо,
> if (S2 = 'я') or (S2='Я')then
подчеркнутое лишнее. проверять надо только на маленькую "я", с большой все в порядке. Но о copy/delete даже не подумал, спс))
Ivolg (2007-07-20 11:43:00) [3]Немного доработал:
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;
Игорь Шевченко (2007-07-20 11:36:00) [4]
> Если мне не изменяет память, это проблема конкретной версии
> Дельфи (кстати, твоя не указана).
Это проблема Windows
http://www.delphikingdom.com/asp/articles_forum.asp?ArticleID=628
Ivolg (2007-07-20 11:13:00) [5]Можно так:
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;
vasIZmax (2007-07-20 11:01:00) [6]
> 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.
вот здесь пробел не помогает((
ЗЫ. вот уж это "я"(((
Desdechado (2007-07-20 10:45:00) [7]Если мне не изменяет память, это проблема конкретной версии Дельфи (кстати, твоя не указана).
И пробел в строке должен решать проблему.
vasIZmax (2007-07-20 08:17:00) [8]
> Anatoly Podgoretsky © (20.07.07 07:45) [10]
И как такие проблемы обходить?
Anatoly Podgoretsky (2007-07-20 07:45:00) [9]> vasIZmax (20.07.2007 07:37:09) [9]
Потому что у нее код $FF
vasIZmax (2007-07-20 07:37:00) [10]
> ASoft (20.07.07 07:32) [8]
Хм... странный ход, но главное - рабочий. И меня устроит. Спс.
ЗЫ. А вот почему без пробела не желает появляться буква, вот это интересно)))
ASoft (2007-07-20 07:32:00) [11]поставь пробел перед s[t]: wer.Caption:=' '+s[t];
если тебя это устроит
ASoft (2007-07-20 07:18:00) [12]Я - появляется, я - нет:-)
vasIZmax (2007-07-20 06:46:00) [13]
> ASoft (20.07.07 06:40) [5]
Результат = 0...
Даже если так:
ini.WriteString('Edit_Text', 'edit1', 'Прояяяяявка');
ни одной не появляется буквы "я"
ASoft (2007-07-20 06:40:00) [14]
> А если будет не "статья", а "проявка"?:-)
а ты проверь
vasIZmax (2007-07-20 06:25:00) [15]
> ASoft (20.07.07 06:21) [3]
А если будет не "статья", а "проявка"?:-)
здесь в чем-то другом проблема((
ASoft (2007-07-20 06:21:00) [16]Попробуй так:
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 05:17:00) [17]Пишу пошагово (может за одно и саму станет ошибка видна).
При первом запуске проги в поле едит пишем слово "Статья".
Нажимаем кнопку и создаются панели таким образом:
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 04:50:00) [18]...
> потом на каждый символ создается панель, и в свойство caption
> выводится по одному символу
как создаешь? кусок кода давай..