18. august 2010 - 15:48Der er
4 kommentarer og 2 løsninger
Forskellige elementer i en liste
Hej
Jeg har en grafisk editor hvor jeg har 3 forskellige typer elementer at arbejde med. Jeg har oprettet en klasse GFXElement som er en base-klasse med bl.a. X & Y koordinater. Til de 3 forskellige typer elementer (GFXButton, GFXLabel, GFXImage) er der så nogle properties som f.eks. kun er fælles for 2 af typerne. Eksempel: GFXButton og GFXLabel har begge en text men det har GFXImage ikke.
Når jeg grafisk markerer en enkelt type (f.eks. GFXButton) har jeg mulighed for at redigere alle dens properties i en usercontrol. Men hvis jeg markerer forskellige typer elementer skal jeg på en måde have fundet ud hvilke properties der er fælles for dem der er valgt?
Jeg har tænkt på at lave en liste med de properties der findes, og lave en løkke hvor jeg tæller op hver gang jeg møder en fælles property. Til sidst kan jeg se om antallet af elementer svarer til min tæller for hver property og på den måde se om den er fælles for alle dem der er valgt. Så hvis jeg har markeret en GFXButton og en GFXLabel er text fælles, men markerer jeg også en GFXImage er det kun X & Y der er fælles. Håber i forstår, ellers bare spørg!
Jeg har prøvet at arbejde lidt videre på det og har fundet en løsning. Men du skal have tak for forsøget!
Først definerer jeg en enum med de fælles properties jeg kan have. Dernæst laver jeg en samlet variabel til fælles properties og til sidst tjekker jeg om hver property skal med. Håber det samtidig uddyber spørgsmålet lidt.
private enum PropertyType { Text = 1, TextColor = 2, Font = 4, X = 8, Y = 16, Width = 32, Height = 64, Image = 128, }
foreach (GFXElement elem in this.elementList) { if (elem is GFXButton) { if (firstrun) { common = ptBtn; } else { common &= ptBtn; } } else if (elem is GFXLabel) { if (firstrun) { common = ptLbl; } else { common &= ptLbl; } } else if (elem is GFXImage) { if (firstrun) { common = ptImg; } else { common &= ptImg; } } firstrun = false; }
if ((common & PropertyType.X) == PropertyType.X) { Console.WriteLine("X skal med"); } if ((common & PropertyType.Y) == PropertyType.Y) { Console.WriteLine("Y skal med"); } if ((common & PropertyType.Width) == PropertyType.Width) { Console.WriteLine("Width skal med"); } if ((common & PropertyType.Height) == PropertyType.Height) { Console.WriteLine("Height skal med"); } if ((common & PropertyType.Text) == PropertyType.Text) { Console.WriteLine("Text skal med"); } if ((common & PropertyType.TextColor) == PropertyType.TextColor) { Console.WriteLine("TextColor skal med"); } if ((common & PropertyType.Font) == PropertyType.Font) { Console.WriteLine("Font skal med"); } if ((common & PropertyType.Image) == PropertyType.Image) { Console.WriteLine("Image skal med"); }
Godt du har fået det til at spille. Nu kunne jeg ikke lade være, men her er en anden version, som gør det samme som din, men bruger linq til at finde fælles propertytypes :)
using System; using System.Collections.Generic; using System.Linq;
namespace ConsoleApplication1 { class Program { private static readonly PropertyType[] AllPropertyTypes = (PropertyType[])Enum.GetValues(typeof(PropertyType));
Ja det var også en mulighed. Man sparer lidt kode, men på denne måde bruger man lister med PropertyTypes i stedet for lister med GFXElements som jeg allerede har at arbejde med.
Jeg ved ikke umiddelbart hvad der er smartest, men nu lader jeg det være som det er :)
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.