Форум: "Начинающим";
Текущий архив: 2009.02.15;
Скачать: [xml.tar.bz2];
Внизкак преобразовать array и caption ? Найти похожие ветки
← →
inviz (2008-12-28 21:03) [0]здравствуйте! Как решить проблему перевода одного типа данных в другую, пишу:
datatemp = record
name:array[0..255] of char;
...
end;
...
datatemp[0].name:=edit1.Text; - тут ошибка
пишет Incompatible types: "Array" and "TCaption"
тоесть несоответствие типов "массив" и "надпись"
как преобразовать? пробовал datatemp[0].name:=PChar(edit1.Text) не помогает,
datatemp[0].name:=PAnsiChar(edit1.Text) тоже не помогает, пробовал datatemp[0].name:=PWideChar(edit1.Text)
тоже не помогает что делать? :(
з.ы. Пишу в CodeGear RAD Studio Delphi 2009
← →
DVM © (2008-12-28 21:24) [1]
> что делать? :(
Move()
← →
inviz (2008-12-28 21:39) [2]Благодарю. Частично работает ))
пишу:
s:=edit1.Text;
Move(s,datatemp[0].name,length(edit1.Text));
showmessage(datatemp[0].name);
m:=datatemp[0].name;
showmessage(m);
выдает каля-баля несмотря на то что текст в s до операции Move()
отображается нормально...
← →
DVM © (2008-12-28 21:51) [3]
> inviz (28.12.08 21:39) [2]
вот тебе туда и обратно:procedure TForm1.Button1Click(Sender: TObject);
var
name: array[0..255] of char;
s: string;
begin
Move(Caption[1], name[0], 256 * SizeOf(Char));
s := name;
Label1.Caption := s;
end;
← →
Германн © (2008-12-29 01:16) [4]
> name:array[0..255] of char;
А зачем вообще тут нужен array? Почему не использоватьname : ShortString;
?
И тогда вообще никаких проблем.
← →
inviz (2008-12-29 04:47) [5]
> А зачем вообще тут нужен array? Почему не использовать
а файл в который пишу запись нетипизированный
← →
inviz (2008-12-29 07:21) [6]
> DVM ©
Дмитрий! Низкий вам поклон! :) заработало все как надо! :)
← →
inviz (2008-12-29 07:30) [7]Кстати, чтобы не плодить вопросы в виде новых тем спрошу тут, такой вопрос:
я пишу простенькую базу данных и у меня в ней есть форма добовления записи которая содержит 20 Edit"ов вопрос в следующем - можно ли каким нибудь способом в 1 функцию очистить эти Edit"ы так сказать обнулить? сейчас у меня есть процедура которая очищает все эти Edit"ы:
procedure ClearDataAdd;
begin
edit1.text:=" ";
...
edit20.text:=" ";
end;
и мне кажется что это, как то не правельно с точки зрения синтаксиса Delphi, ну или этики написания кода так чтоли выразится...
можно ли как нибудь так:formadd.allcomponent.text:=" "; (ну это пример ^-^)
← →
Palladin © (2008-12-29 08:17) [8]TComponent.FindComponent + F1
← →
{RASkov} © (2008-12-29 09:05) [9]...или просто пробежаться по контролам(Controls) родителя этих всех эдитов, и если на этом родителе нужно очистить все эдиты, то:
проверка (Controls[i] is TEdit) и при выполнении условия TEdit(Controls[i]).Clear;
← →
{RASkov} © (2008-12-29 09:07) [10]> TEdit(Controls[i]).Clear;
> .text:=" ";
При очистки эдитов обязателен пробел? Тогда вместо Clear делай как у тебя:TEdit(Controls[i]).text:=" ";
← →
inviz (2008-12-29 10:45) [11]
> {RASkov} ©
> и при выполнении условия TEdit(Controls[i]).Clear;
Во спасиб а я думаю ну как то ж должнобыть отслеживание контролов
> При очистки эдитов обязателен пробел?
да не это я тут писал думал что не видно будет...
← →
Германн © (2008-12-29 13:47) [12]
> inviz (29.12.08 04:47) [5]
>
>
> > А зачем вообще тут нужен array? Почему не использовать
>
> а файл в который пишу запись нетипизированный
>
Ну и?
← →
inviz (2008-12-29 22:07) [13]
> Германн ©
> Ну и?
нада попробовать...
← →
Германн © (2008-12-30 00:59) [14]
>
> inviz (29.12.08 22:07) [13]
>
> > Германн ©
> > Ну и?
>
> нада попробовать...
Чудаки вы, мОлодежь!
В одних вдолбили, что тип String может содержать не более 255 символов и они спрашивают "как в Дельфи записать в строку больше 255 символов".
Другим (вроде тебя) вдолбили, что при сохранении в файл нельзя использовать в Дельфи тип String. Ибо при этом в файл записывается указатель на переменную этого типа в АП записывающего процесса, а не сама строка. Но забыли вспомнить родную Паскалевскую строку.
← →
DevilDevil (2008-12-30 13:06) [15]procedure TForm1.Button1Click(Sender: TObject);
var
name: array[0..255] of char;
s: string;
begin
Move(Caption[1], name[0], 256 * SizeOf(Char));
s := name;
Label1.Caption := s;
end;
аааАА!!!! Это что за страх вообще???
Это ещё и к AV не приводит?// если в name после строковых сиволов идёт символ #0
procedure NameToString(var S: string; const name: array[0..255] of char);
begin
S := name;
end;
procedure StringToName(var name: array[0..255] of char; const S: string);
var
Len: integer;
begin
Len := Length(S);
if (Len > 255) then
raise Exception.CreateFmt("Всё, пипец, S - слишком длинная строка(%d символов)", [Len]);
// скопировать символы
CopyMemory(@name, pointer(S), Len);
// завершающий символ
name[Len] := #0;
{
Но можно и одной функцией CopyMemory(@name, pointer(S), Len+1);
А если без проверки, то реализация - одна строка: CopyMemory(@name, pointer(S), Length(S)+1);
}
end;
← →
DevilDevil (2008-12-30 13:08) [16]Added: Последний параметр CopyMemory надо домножать на sizeof(char)
← →
DVM © (2008-12-30 13:49) [17]
> DevilDevil
> аааАА!!!! Это что за страх вообще???
> Это ещё и к AV не приводит?
>
Не приводит. И не приведет. Никогда. Просто надо хорошенько на него посмотреть и подумать.
А вот твой код в общем случае не рабочий вообще. Увы. И чтобы это понять, надо взять к примеру последнюю версию Delphi.
← →
DVM © (2008-12-30 14:24) [18]
> DevilDevil
Более того, код не то что не рабочий, он даже не может быть скомпилирован.
← →
DevilDevil (2008-12-30 16:03) [19]>И чтобы это понять, надо взять к примеру последнюю версию Delphi.
пост [16]
>Более того, код не то что не рабочий, он даже не может быть скомпилирован.
фигня.array[0..255] of char ---> type Tname
>Не приводит. И не приведет. Никогда.
>Просто надо хорошенько на него посмотреть и подумать.Move(Caption[1], name[0], 256 * SizeOf(Char));
Вызывает RangeError, если Caption = ""
Из строки нельзя читать 256 символов, если их там меньше 255. То, что нет AV - чудо.
Я неправ?
← →
inviz (2008-12-30 16:28) [20]
> Более того, код не то что не рабочий, он даже не может быть
> скомпилирован.
как это не может быть скампелирован? все компелируется не нада понимать буквально array[0..255] of char и вставлять
это подразумевает n:array[0..255] of char.
> >Просто надо хорошенько на него посмотреть и подумать.Move(Caption[1],
> name[0], 256 * SizeOf(Char));Вызывает RangeError, если
> Caption = ""
а че тут думать ? вот как использую я код приведенный в 4-ом посте DVM
var
name:array[0..255] of char;
s:string
begin
s := edit1.Text;
Move(s[1],name,256 * SizeOf(Char));
все отлично работает за это еще раз спасибо DVM.
> DevilDevil
> Из строки нельзя читать 256 символов, если их там меньше
> 255. То, что нет AV - чудо.Я неправ?
Ты не прав если говоришь про array[0..255] of char их там не 255 а 256,
что 0 для тебя не цифра? дословно от нуля до двухсот пятидесяти пяти эквивалентно от одного до двухсот пятидесяти шести
Вопрос был "как преобразовать "array" и "caption"?"
Ответ был получен еще в 4 посте. Тема закрыта хватит флудить
← →
Anatoly Podgoretsky © (2008-12-30 17:07) [21]> inviz (30.12.2008 16:28:20) [20]
Зато в S не 256
← →
DevilDevil (2008-12-30 17:11) [22]> inviz (30.12.08 16:28) [20]
эх и нифига!
нормально вообще! ))
ну фиг с тобой, живи и возрадуйся обожаемой всеми "ошибке памяти непонятно откуда"
← →
DVM © (2008-12-30 20:45) [23]
> DevilDevil (30.12.08 16:03) [19]
Во-первых.
Я лишь привел пример использования данной функции, но подразумевалось, что не стоит слепо повторять написанное, это же очевидно. Данные строки лишь иллюстрировали то, что Move() перекрасно может выполнять то, что требуется. Писать развернутый пример,учитывая все возможные внешние факторы мне просто было лень. И мне непонятна твоя реакция неадекватная на это.
> То, что нет AV - чудо.
Это не чудо. Но в так делать конечно не следует.
> Вызывает RangeError, если Caption = ""
Не надо бояться исключений. Их лишь надо перехватывать и обрабатывать, если на то есть нужда. В принципе блок обработки исключения сделает то же самое по сути, что ты сделал бы, например с помощью ветвления и проверки до вызова Move.
Во-вторых.
Проблему своего кода ты так и не увидел. С какой стати в последний элемент массива ты кладешь #0? Кто сказал, что там должен быть 0? Кто-то хотел этот 0 сохранять в файл? А он будет ведь сохранен туда. Про си строки можешь не вспоминать - это всем и так известно. Но кто сказал, что в массиве си-строка? Своим эти нулем плюс ко всему, ты принудительно ограничил размер данных в массиве 255 символами, в то время как их там могло бы быть 256. 1 символ ты откусил под терминатор.
Не знаю, хорошо ли объяснил, но надеюсь суть ясна.
← →
DevilDevil (2008-12-31 09:40) [24]кхм...
1) дошло, почему скорее всего не вызовет AV
2) вероятность AV всёже есть. + если строка пуста (pointer(S) = nil), то должен быть AV
3) это очень некорректное обращение со строками. Поэтому и реакция соответсвующая.
4) исключений надо бояться. И не допускать гоблинского кода.
5) если строку вдальнейшем планируется преобразовывать к строке (Caption := name), то нужен 0 в конце. Как минимум, должен быть "показатель длинны"
← →
DVM © (2008-12-31 15:47) [25]
> DevilDevil (31.12.08 09:40) [24]
> вероятность AV всёже есть
Есть. Я даже знаю в каком случае :) Но вероятность этого случая мала.
> 4) исключений надо бояться. И не допускать гоблинского кода.
Гоблинского кода конечно допускать не надо в реальных приложениях. Но то реальное приложение, а не пара строк на форуме.
Насчет исключений ты не прав. Их основное предназначение как раз и есть - отделение места обработки ошибки от места ее возникновения. Как считается способствует удобочитаемости кода. Конечно спорный вопрос, не всем такой подход нравится (мне тоже не очень), но подход правильный. Другое дело, что надо ухо держать востро с этими исключениями, особенно при выделении и освобождении ресурсов и в серверных или многопоточных приложениях.
> если строку вдальнейшем планируется преобразовывать к строке
> (Caption := name), то нужен 0 в конце
0 нужен лишь для того, чтобы понять где конец строки. Если конечно это строка. В массиве предварительно проиннициализированном нулями это необязательно. т.к. если последний символ не 0 длина известна, в противном случае нули укажут на конец.
Если массив был проиннициализирован нулями то 0 там будет в конце в любом случае.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2009.02.15;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.007 c