Считывание строк из файла ресурсов

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Remorhaz
Начинающий
Начинающий
 
Сообщения: 2
Зарегистрирован: 11.04.2006 (Вт) 19:40
Откуда: Москва

Считывание строк из файла ресурсов

Сообщение Remorhaz » 16.04.2006 (Вс) 10:45

Доброго времени суток!

Я написал простенький цикл, считывающий строки из файла ресурсов:

Код: Выделить всё
    For i = 4500 To 4999
     s = LoadResString(i)
      If (Err.Number = 0) Then
       MsgBox s
      End If
     Next i


Проблема в том, что я не знаю заранее, есть ли в файле строка или нет - т.е. в заданном диапозоне может быть всего 5-6 строк. Естественно, как только происходит ошибка при загрузке несуществующего ресурса - программа падает.
Вопрос: как можно заглушить ошибку при вызове функции LoadResString? Или хотя бы, как проверить, существует строка в файле или нет, еще до ее загрузки?

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 16.04.2006 (Вс) 11:07

Перед циклом поставь On Error Resume Next.
Lasciate ogni speranza, voi ch'entrate.

AjaxVS
Постоялец
Постоялец
 
Сообщения: 506
Зарегистрирован: 01.12.2004 (Ср) 13:12
Откуда: Donetsk, Battle.Net

Сообщение AjaxVS » 17.04.2006 (Пн) 0:07

Что-то я не заметил - а когда исправили баг с бесконечным циклом после On error resume next?

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 17.04.2006 (Пн) 5:20

Что-то я не заметил -- а что был за баг?
Изображение

FaKk2
El rebelde gurú
El rebelde gurú
Аватара пользователя
 
Сообщения: 2031
Зарегистрирован: 09.03.2003 (Вс) 22:10
Откуда: Los Angeles

Сообщение FaKk2 » 17.04.2006 (Пн) 5:21

А вообще, полагаться на исключения не есть хороший способ программирования.
Для получения ответа надо продемонстрировать качества, позволяющие стать компетентным — внимательность, вдумчивость, наблюдательность, желание активно участвовать в выработке решения.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 17.04.2006 (Пн) 5:30

FAKK2 писал(а):А вообще, полагаться на исключения не есть хороший способ программирования.

А зачем тогда, по-твоему, вообще нужны исключения? Если на них нельзя полагаться?
Изображение

FaKk2
El rebelde gurú
El rebelde gurú
Аватара пользователя
 
Сообщения: 2031
Зарегистрирован: 09.03.2003 (Вс) 22:10
Откуда: Los Angeles

Сообщение FaKk2 » 17.04.2006 (Пн) 8:24

tyomitch
Исключения на то и исключения что их нельзя предусмотреть, но желательно сделатъ так чтоб программа не рушилась.

А использовать исключения в качестве алгоритма работы плохая идея. Вот пример:

Код: Выделить всё
try
{
    int i = 0;
    while (true)
    {
        doSomeStuffWithArrayElement(arr[i]);
        i++;
    }
}
catch (Exception ArgumentOutOfRange)
{
    // we looped thru entire array
}


Этот метод имеет право на жизнь по твоему?
Для получения ответа надо продемонстрировать качества, позволяющие стать компетентным — внимательность, вдумчивость, наблюдательность, желание активно участвовать в выработке решения.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 17.04.2006 (Пн) 9:40

Я сейчас не могу найти точную ссылку, но на http://thedailywtf.com/ был пример как раз такого кода -- причём со ссылкой, что в какой-то книге про Жаву он приводится как пример эффективного использования исключений :-P


На самом деле -- а чем плох такой код?
Изображение

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 17.04.2006 (Пн) 9:55

Вот. Эффективно, изящно, и просто красиво.

Код: Выделить всё
Option Explicit

Private Power2() As Long

Function Bin2Dec(ByVal BinValue As String) As Long
Dim P As Long, I As Long, C As Long, V As Long, fBit As Boolean
If Len(BinValue) = 0 Then Exit Function
V = 0
For I = Len(BinValue) To 1 Step -1
  P = Len(BinValue) - I
  If (Mid$(BinValue, I, 1) = "1") Then V = V + Power2(P)
Next I
Exit Function

ErrorHandler:
ReDim Power2(0 To 15)
For C = 0 To 15
  Power2(C) = 2^C
Next C
Resume
End Function
Lasciate ogni speranza, voi ch'entrate.

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 17.04.2006 (Пн) 10:58

alibek писал(а):Перед циклом поставь On Error Resume Next.


Кстати, хорошо бы в кирпичиках завести хорошенький классик для работы с реестром. Мой как-то успел обрасти ненужностями - выкладывать его неохота.

Есть у кого хорошо причесанный класс?

Желательно чтобы в нем были методы получения списков ключей/значений ветки, ну и работа с бинарными данными...
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 17.04.2006 (Пн) 11:04

Изображение

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 17.04.2006 (Пн) 11:10

tyomitch писал(а):http://bbs.vbstreets.ru/viewtopic.php?t=9666


Увы, там даже не класс...

А хочется именно готовенького, ибо становится уже лень писать подобные вещи на VB6 - при мысли об этом начинаешь тоскливо смотреть в сторону NET... :lol:
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 17.04.2006 (Пн) 11:24

Andrey Fedorov писал(а):Увы, там даже не класс...

Обоснуй необходимость иметь класс, а не модуль.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Andrey Fedorov
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3287
Зарегистрирован: 21.05.2004 (Пт) 9:28
Откуда: Москва

Сообщение Andrey Fedorov » 17.04.2006 (Пн) 11:31

GSerg писал(а):
Andrey Fedorov писал(а):Увы, там даже не класс...

Обоснуй необходимость иметь класс, а не модуль.


Да просто удобней. Открыл ключик и работаешь с ним.
Ну и я как-то привык писать навроде:

Код: Выделить всё
cr.RootKey = HKEY_CURRENT_USER
IF cr.OpenKey("Software\Microsoft\HTML Help Workshop") Then
       cr.ReadString("InstallDir", m_sHhcExe) Then
...
Фиг Вам! - Сказал Чебурашка, обгладывая Крокодила Гену...

FaKk2
El rebelde gurú
El rebelde gurú
Аватара пользователя
 
Сообщения: 2031
Зарегистрирован: 09.03.2003 (Вс) 22:10
Откуда: Los Angeles

Сообщение FaKk2 » 17.04.2006 (Пн) 17:49

tyomitch писал(а):Я сейчас не могу найти точную ссылку, но на http://thedailywtf.com/ был пример как раз такого кода -- причём со ссылкой, что в какой-то книге про Жаву он приводится как пример эффективного использования исключений :-P


На самом деле -- а чем плох такой код?


Да, там такой код был :)

Чем же он плох?
Тем же самым, исключения это не нормальный workflow программы и использовать их нужно сугубо по назначению: вылавливать непредусмотренные ошибки.
Для получения ответа надо продемонстрировать качества, позволяющие стать компетентным — внимательность, вдумчивость, наблюдательность, желание активно участвовать в выработке решения.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 17.04.2006 (Пн) 18:39

FAKK2 писал(а):Чем же он плох?
Тем же самым, исключения это не нормальный workflow программы и использовать их нужно сугубо по назначению: вылавливать непредусмотренные ошибки.


Хорошо, а код в духе "doSomething() || handleError();" вместо "if (!doSomething()) handleError();" -- тоже некошерно из-за того, что оператор || предусмотрен не для этого?


Ну не понимаю я таких людей. Навязали на себя кучу догм и искусственных ограничений, и радуются.
Изображение

FaKk2
El rebelde gurú
El rebelde gurú
Аватара пользователя
 
Сообщения: 2031
Зарегистрирован: 09.03.2003 (Вс) 22:10
Откуда: Los Angeles

Сообщение FaKk2 » 17.04.2006 (Пн) 18:49

tyomitch
Причем здесь оператор ||?
Вот у тебя есть некий обьект в классе и ты знаешь, что этот обьект не обязательно создан. Ты так и будешь напрямую к нему обращаться и полагаться на исключение? Или же перед обращением напишешь
Код: Выделить всё
if (class.object != null)


А вот еще ситуация, у тебя есть функция работа которой целиком зависит от существования обьекта. Ты что, обрамишь ее в try...catch или проверишь на нуль?

А я не понимаю таких людей которые пользуются молотком для забивания шурупов и искренне удивляются, что оно не работает так как надо.
Для получения ответа надо продемонстрировать качества, позволяющие стать компетентным — внимательность, вдумчивость, наблюдательность, желание активно участвовать в выработке решения.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 17.04.2006 (Пн) 19:02

FAKK2 писал(а):tyomitch
Причем здесь оператор ||?
Вот у тебя есть некий обьект в классе и ты знаешь, что этот обьект не обязательно создан. Ты так и будешь напрямую к нему обращаться и полагаться на исключение? Или же перед обращением напишешь
Код: Выделить всё
if (class.object != null)


А вот еще ситуация, у тебя есть функция работа которой целиком зависит от существования обьекта. Ты что, обрамишь ее в try...catch или проверишь на нуль?

А какая, вообще говоря, разница? Кроме эстетического удовлетворения читающего такой код?
Работать-то будет одинаково.
Изображение

FaKk2
El rebelde gurú
El rebelde gurú
Аватара пользователя
 
Сообщения: 2031
Зарегистрирован: 09.03.2003 (Вс) 22:10
Откуда: Los Angeles

Сообщение FaKk2 » 17.04.2006 (Пн) 19:18

tyomitch

Во первых, обработка исключений порождает больше кода чем простые проверки. (ты же не будешь спорить с тем, что оформление SEH и оформление проверки на нуль это не тоже самое).

Во вторых, явная проверка перед использованием, повышает читабельность кода и уменьшает шанс краха у заказчика.

Ну и в третих, это культура программирования. Ты же не станешь забивать шурупы молотком, на основании того, что оно "и так работает".
Для получения ответа надо продемонстрировать качества, позволяющие стать компетентным — внимательность, вдумчивость, наблюдательность, желание активно участвовать в выработке решения.

Odrick
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 503
Зарегистрирован: 28.09.2003 (Вс) 2:04

Сообщение Odrick » 17.04.2006 (Пн) 19:22

Неверно. Работать не будет одинаково. В случае исключений выполняеться дополнительная обработка по сравнению с простой проверкой на валидность. А это сказываться на времени выполнения кода. И вообще нужно использовать инструменты по назначению...
То, что для одних константа, для других только переменная...

Odrick
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 503
Зарегистрирован: 28.09.2003 (Вс) 2:04

Сообщение Odrick » 17.04.2006 (Пн) 19:23

Тьфу :) FAKK2 меня опередил :)
То, что для одних константа, для других только переменная...

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 17.04.2006 (Пн) 19:30

Аргумент про "раз назвали исключением, значит надо использовать только в исключительных случаях" я уже отразил, можно его не повторять в каждом ответе :-)

Про "дополнительную обработку" хочу услышать поподробнее. Никак, программисты на .нет начали считать такты процессора? ;-) :-D
Изображение

FaKk2
El rebelde gurú
El rebelde gurú
Аватара пользователя
 
Сообщения: 2031
Зарегистрирован: 09.03.2003 (Вс) 22:10
Откуда: Los Angeles

Сообщение FaKk2 » 17.04.2006 (Пн) 19:41

tyomitch
Ты почему то стал в позицию "докажите мне что я неправ". А ведь это ты должен доказать, что ты прав используя исключения не по назначению. :wink:
Для получения ответа надо продемонстрировать качества, позволяющие стать компетентным — внимательность, вдумчивость, наблюдательность, желание активно участвовать в выработке решения.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 17.04.2006 (Пн) 20:05

А почему вы решили, что назначение исключений -- именно в вылавливании непредусмотренных ошибок?
Даже более узко: а почему вы решили, что у исключений есть какое-то одно назначение?

Ссылки на умные книги не считаются; тот код с выходом из цикла по исключению тоже был в умной книге.
Изображение

FaKk2
El rebelde gurú
El rebelde gurú
Аватара пользователя
 
Сообщения: 2031
Зарегистрирован: 09.03.2003 (Вс) 22:10
Откуда: Los Angeles

Сообщение FaKk2 » 17.04.2006 (Пн) 20:30

tyomitch

Не мы решили (с тем же успехом можно сказать, что мы решили, что молоток это только для забивания гвоздей), а те кто придумал обработку непредусмотренных исключений. В чем заключается смысл исключения?
Правильно, в обработке тех ошибок, которых ты не предусмотрел. Зачем? Чтобы программа на падала по пустякам (не инициализирован обьект например). И все. Они не должны быть использованны в качестве постоянного метода работы.
Например ты делишь два числа. Не нужно тебе полагаться на обработку исключения при делении на ноль, когда можешь проверить делитель сам.
Для получения ответа надо продемонстрировать качества, позволяющие стать компетентным — внимательность, вдумчивость, наблюдательность, желание активно участвовать в выработке решения.

Odrick
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 503
Зарегистрирован: 28.09.2003 (Вс) 2:04

Сообщение Odrick » 17.04.2006 (Пн) 20:32

tyomitch ну если исходить из такой логики, то давай использовать while вместо for для создания циклов с четким количеством итераций. Ну а в самом деле, почему бы и нет? Можно? Можно :) Первое, что пришло в голову... Таких примеров можно привести массу. И вообще, мы уже начинаем флудить не по теме...
То, что для одних константа, для других только переменная...

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 17.04.2006 (Пн) 20:57

Вот обнаружили мы, что в долгом походе на капоте нашего джипа можно жарить яичницу в сковороде. Так почему бы изредка ее там не жарить?

FaKk2
El rebelde gurú
El rebelde gurú
Аватара пользователя
 
Сообщения: 2031
Зарегистрирован: 09.03.2003 (Вс) 22:10
Откуда: Los Angeles

Сообщение FaKk2 » 17.04.2006 (Пн) 21:08

Amed
Яичница на капоте это прошлый век. Вот зажарить стейк под капотом, это да :)
Для получения ответа надо продемонстрировать качества, позволяющие стать компетентным — внимательность, вдумчивость, наблюдательность, желание активно участвовать в выработке решения.

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 17.04.2006 (Пн) 21:10

Как видим, Tyomitch и я правы :)

FaKk2
El rebelde gurú
El rebelde gurú
Аватара пользователя
 
Сообщения: 2031
Зарегистрирован: 09.03.2003 (Вс) 22:10
Откуда: Los Angeles

Сообщение FaKk2 » 17.04.2006 (Пн) 21:30

Amed
В кулинарии может быть. Но в программировании вы на концепции яичницы на капоте далеко не уедете :)
Для получения ответа надо продемонстрировать качества, позволяющие стать компетентным — внимательность, вдумчивость, наблюдательность, желание активно участвовать в выработке решения.

След.

Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: Google-бот, SemrushBot и гости: 178

    TopList  
cron