Что нового

[Массивы] Подсветка найденных совпадений в массиве

paa13

Новичок
Сообщения
31
Репутация
1
Здравствуйте! Помогите разобраться пж-ста.

Есть массив ИП адресов, совпадения подкрашиваются одинаковым цветом, не могу добиться чтобы при отсутствии совпадения цвета не было,
все равно подсовывает цвет, ведь в массиве он находит и сам себя

Вот код:
Код:
$Label1 = GUICtrlCreateLabel($text1, 36, 20, 140, 22, BitOR($WS_BORDER, $ES_CENTER, $SS_CENTERIMAGE))
$Label2 = GUICtrlCreateLabel($text2, 36, 46, 140, 22, BitOR($WS_BORDER, $ES_CENTER, $SS_CENTERIMAGE))
$Label3 = GUICtrlCreateLabel($text3, 36, 72, 140, 22, BitOR($WS_BORDER, $ES_CENTER, $SS_CENTERIMAGE))
$Label4 = GUICtrlCreateLabel($text4, 36, 98, 140, 22, BitOR($WS_BORDER, $ES_CENTER, $SS_CENTERIMAGE))
$Label5 = GUICtrlCreateLabel($text5, 36, 124, 140, 22, BitOR($WS_BORDER, $ES_CENTER, $SS_CENTERIMAGE))


Dim $ip[] = [$text1, $text2, $text3, $text4, $text5]
Dim $colour[] = ["0x9d9d9d","0xdca537","0x5e37dc","0x3f8431","0xd1428c"]

For $i = 0 To UBound($ip) - 1
For $i = 0 To UBound($colour) - 1

    If $text1 = $ip[$i] then
		GUICtrlSetBkColor($Label1, $colour[$i])
    Else
        GUICtrlSetBkColor($Label1, $GUI_BKCOLOR_TRANSPARENT)
	EndIf
    If $text2 = $ip[$i] then GUICtrlSetBkColor($Label2, $colour[$i])
	If $text3 = $ip[$i] then GUICtrlSetBkColor($Label3, $colour[$i])
	If $text4 = $ip[$i] then GUICtrlSetBkColor($Label4, $colour[$i])
	If $text5 = $ip[$i] then GUICtrlSetBkColor($Label5, $colour[$i])

Next
Next
 

InnI

AutoIT Гуру
Сообщения
4,613
Репутация
1,298
Если я правильно понял, то так
Код:
#include <GuiConstants.au3>

GUICreate("")
GUISetState()

Global $text1 = "127.0.0.1", $text2 = "127.0.0.2", $text3 = "127.0.0.3", $text4 = "127.0.0.4", $text5 = "127.0.0.5"

Dim $Label[5]
$Label[0] = GUICtrlCreateLabel("127.0.0." & Random(1, 9, 1), 36,  20, 140, 22, BitOR($WS_BORDER, $ES_CENTER, $SS_CENTERIMAGE))
$Label[1] = GUICtrlCreateLabel("127.0.0." & Random(1, 9, 1), 36,  46, 140, 22, BitOR($WS_BORDER, $ES_CENTER, $SS_CENTERIMAGE))
$Label[2] = GUICtrlCreateLabel("127.0.0." & Random(1, 9, 1), 36,  72, 140, 22, BitOR($WS_BORDER, $ES_CENTER, $SS_CENTERIMAGE))
$Label[3] = GUICtrlCreateLabel("127.0.0." & Random(1, 9, 1), 36,  98, 140, 22, BitOR($WS_BORDER, $ES_CENTER, $SS_CENTERIMAGE))
$Label[4] = GUICtrlCreateLabel("127.0.0." & Random(1, 9, 1), 36, 124, 140, 22, BitOR($WS_BORDER, $ES_CENTER, $SS_CENTERIMAGE))

Dim $ip[] = [$text1, $text2, $text3, $text4, $text5]
Dim $colour[] = ["0x9d9d9d","0xdca537","0x5e37dc","0x3f8431","0xd1428c"]

For $i = 0 To UBound($Label) - 1
  GUICtrlSetBkColor($Label[$i], $GUI_BKCOLOR_TRANSPARENT)
  $Text = GUICtrlRead($Label[$i])
  For $j = 0 To UBound($ip) - 1
    If $Text = $ip[$j] Then
      GUICtrlSetBkColor($Label[$i], $colour[$j])
      ExitLoop
    EndIf
  Next
Next

Do
Until GUIGetMsg() = -3


На будущее. Если приводите код, то обеспечьте хотя бы его запуск.
 
Автор
P

paa13

Новичок
Сообщения
31
Репутация
1
InnI сказал(а):
На будущее. Если приводите код, то обеспечьте хотя бы его запуск.
Прошу прощения!

Попробую подробнее объяснить.
Нужно отмечать разным цветом совпадения (например три совпадения, все зеленый цвет, другие два-синий, другие два или три коричневый и тд),
если нет совпадений, то цвет не давать. (на данный момент при любой комбинации подсветка совпадений работает, не работает отсутствие подсветки у тех ип у которых нет совпадений)
Все это не статично, ип будут постоянно менять свои места, может не быть совпадений, тогда все без цвета, как тока есть совпадение они подсвечиваются одним цветом, другие совпадения другим цветом.

На данный момент совпадения 1-5-6, 2-3 и 7-8, но и 4-му тоже назначается цвет, хотелось чтобы ему цвет не назначался (поскольку совпадений нет)

Код:
#include <GuiConstants.au3>

GUICreate("")
GUISetState()

Global $text1 = "73.10.110.54", $text2 = "27.10.0.2", $text3 = "27.10.0.2", $text4 = "127.12.44.44", $text5 = "73.10.110.54", _
       $text6 = "73.10.110.54", $text7 = "87.11.0.2", $text8 = "87.11.0.2"

$Label1 = GUICtrlCreateLabel($text1, 36, 20, 140, 22, BitOR($WS_BORDER, $ES_CENTER, $SS_CENTERIMAGE))
$Label2 = GUICtrlCreateLabel($text2, 36, 46, 140, 22, BitOR($WS_BORDER, $ES_CENTER, $SS_CENTERIMAGE))
$Label3 = GUICtrlCreateLabel($text3, 36, 72, 140, 22, BitOR($WS_BORDER, $ES_CENTER, $SS_CENTERIMAGE))
$Label4 = GUICtrlCreateLabel($text4, 36, 98, 140, 22, BitOR($WS_BORDER, $ES_CENTER, $SS_CENTERIMAGE))
$Label5 = GUICtrlCreateLabel($text5, 36, 124, 140, 22, BitOR($WS_BORDER, $ES_CENTER, $SS_CENTERIMAGE))
$Label6 = GUICtrlCreateLabel($text6, 36, 150, 140, 22, BitOR($WS_BORDER, $ES_CENTER, $SS_CENTERIMAGE))
$Label7 = GUICtrlCreateLabel($text7, 36, 176, 140, 22, BitOR($WS_BORDER, $ES_CENTER, $SS_CENTERIMAGE))
$Label8 = GUICtrlCreateLabel($text8, 36, 202, 140, 22, BitOR($WS_BORDER, $ES_CENTER, $SS_CENTERIMAGE))

Dim $ip[] = [$text1, $text2, $text3, $text4, $text5, $text6, $text7, $text8]
Dim $colour[] = ["0x9d9d9d","0xdca537","0x5e37dc","0x3f8431","0xd1428c","0x572e43","0x11f400","0x1f6b96"]

For $i = 0 To UBound($ip) - 1
For $i = 0 To UBound($colour) - 1

    If $text1 = $ip[$i] then GUICtrlSetBkColor($Label1, $colour[$i])
    If $text2 = $ip[$i] then GUICtrlSetBkColor($Label2, $colour[$i])
	If $text3 = $ip[$i] then GUICtrlSetBkColor($Label3, $colour[$i])
	If $text4 = $ip[$i] then GUICtrlSetBkColor($Label4, $colour[$i])
	If $text5 = $ip[$i] then GUICtrlSetBkColor($Label5, $colour[$i])
	If $text6 = $ip[$i] then GUICtrlSetBkColor($Label6, $colour[$i])
	If $text7 = $ip[$i] then GUICtrlSetBkColor($Label7, $colour[$i])
	If $text8 = $ip[$i] then GUICtrlSetBkColor($Label8, $colour[$i])

Next
Next

Do
Until GUIGetMsg() = -3
 

InnI

AutoIT Гуру
Сообщения
4,613
Репутация
1,298
paa13 [?]
На данный момент совпадения 1-5-6, 2-3 и 7-8
Мой вариант именно так и работает. Запустите его несколько раз подряд, чтобы были одинаковые совпадения. Или уменьшите случайное число в тексте до шести, чтобы совпадения были чаще
Код:
...
Dim $Label[5]
$Label[0] = GUICtrlCreateLabel("127.0.0." & Random(1, 6, 1), 36,  20, 140, 22, BitOR($WS_BORDER, $ES_CENTER, $SS_CENTERIMAGE))
$Label[1] = GUICtrlCreateLabel("127.0.0." & Random(1, 6, 1), 36,  46, 140, 22, BitOR($WS_BORDER, $ES_CENTER, $SS_CENTERIMAGE))
$Label[2] = GUICtrlCreateLabel("127.0.0." & Random(1, 6, 1), 36,  72, 140, 22, BitOR($WS_BORDER, $ES_CENTER, $SS_CENTERIMAGE))
$Label[3] = GUICtrlCreateLabel("127.0.0." & Random(1, 6, 1), 36,  98, 140, 22, BitOR($WS_BORDER, $ES_CENTER, $SS_CENTERIMAGE))
$Label[4] = GUICtrlCreateLabel("127.0.0." & Random(1, 6, 1), 36, 124, 140, 22, BitOR($WS_BORDER, $ES_CENTER, $SS_CENTERIMAGE))
...
 
Автор
P

paa13

Новичок
Сообщения
31
Репутация
1
InnI сказал(а):
Мой вариант именно так и работает. Запустите его несколько раз подряд, чтобы были одинаковые совпадения.
Странно, но у меня все в разнобой показывает
 

Вложения

  • 1.JPG
    1.JPG
    14.4 КБ · Просмотры: 3
  • 2.JPG
    2.JPG
    14.1 КБ · Просмотры: 2
  • 3.JPG
    3.JPG
    14.1 КБ · Просмотры: 2

InnI

AutoIT Гуру
Сообщения
4,613
Репутация
1,298
paa13 [?]
все в разнобой показывает
Естественно. Так и задумано, чтобы показать нужную вам "динамику".
При запуске все label заполняются случайными IP (от 1 до 9). Далее каждый IP от 1 до 5 подсвечивается своим цветом, от 6 до 9 не подсвечиваются. На 2.jpg видно, что оба "третьих" IP подсвечены синим. Разве это не то, что вам нужно?
 
Автор
P

paa13

Новичок
Сообщения
31
Репутация
1
При запуске все label заполняются случайными IP (от 1 до 9). Далее каждый IP от 1 до 5 подсвечивается своим цветом, от 6 до 9 не подсвечиваются. На 2.jpg видно, что оба "третьих" IP подсвечены синим. Разве это не то, что вам нужно?

Боюсь это совсем не то.
1 скрин должно быть (совпали только 6-ки (они должны быть одного цвета)5,9 и 4 у них пары нет - без цвета)
2 скрин (совпали 3-ки, 6-7-5 - без цвета (тут 5-ка розовая)
3 скрин вообще ни у кого пары нет - все без цвета


Добавлено:
Сообщение автоматически объединено:

Если искать IP от 1 до 5, то подсветка в вашем коде на совпадения работает корректно, но он так же назначает цвет тем IP у которых пары нет, а это как раз то что и не получается сделать.

Попробую подробней описать ситуацию:
Пример: Представьте что таких окошек с ИП 100 штук и есть одно совпадение, если оно подкрашено его сразу видно, а если все ип будут покрашены в разные цвета (и совпавшие и не совпавшие), это будет такая палитра, что найти так сразу не получится. Тоже самое и без подсветки вообще, на сером фоне 100 окошек с ИП, даже одно совпадение найти не реально, а если совпало 2-3, вообще ребус :smile:
 

InnI

AutoIT Гуру
Сообщения
4,613
Репутация
1,298
Честно говоря, плохо понимаю, зачем это нужно. Одинаковые адреса можно просто не выводить.
Но если надо... Пробуйте
Код:
#include <GuiConstants.au3>

GUICreate("")
GUISetState()

Dim $Label[5], $ip[5], $colour[] = ["0x9d9d9d","0xdca537","0x5e37dc","0x3f8431","0xd1428c"]
For $i = 0 To 4
  $Label[$i] = GUICtrlCreateLabel("127.0.0." & Random(1, 6, 1), 36, 20 + $i * 26, 140, 22, BitOR($WS_BORDER, $ES_CENTER, $SS_CENTERIMAGE))
  $ip[$i] = "127.0.0." & $i + 1
Next
$Button = GUICtrlCreateButton("Обновить", 36, 200, 140, 22)

Refresh()
Do
  Switch GUIGetMsg()
    Case -3
      Exit
    Case $Button
      Refresh()
  EndSwitch
Until 0

Func Refresh()
  For $i = 0 To 4
    GUICtrlSetData($Label[$i], "127.0.0." & Random(1, 5, 1))
  Next
  Local $Str, $Temp[5], $Text
  For $i = 0 To UBound($Label) - 1
    $Str &= GUICtrlRead($Label[$i]) & "|"
  Next
  For $i = 0 To UBound($ip) - 1
    StringReplace($Str, $ip[$i], "")
    If @extended > 1 Then $Str = StringReplace($Str, $ip[$i], "")
  Next
  $Temp = StringSplit(StringTrimRight($Str, 1), "|", 2)
  For $i = 0 To UBound($Temp) - 1
    If $Temp[$i] Then
      GUICtrlSetBkColor($Label[$i], $GUI_BKCOLOR_TRANSPARENT)
    Else
      $Text = GUICtrlRead($Label[$i])
      For $j = 0 To UBound($ip) - 1
        If $Text = $ip[$j] Then GUICtrlSetBkColor($Label[$i], $colour[$j])
      Next
    EndIf
  Next
EndFunc
 
Автор
P

paa13

Новичок
Сообщения
31
Репутация
1
Спасибо, работает! Пока не понял как, но буду разбираться... :stars:
 
Верх